查找所选对象的索引
Find the Index of the Selected Object
给定一个对象 Foo
,它具有方法 bool isChecked() const
。假设我有 Foo foos[]
.
我保证 foos
中只有一个元素会 return true
isChecked()
,所有其他元素会 return false
。
我正在寻找一种聪明的 C++03 方法来查找 true
元素的索引。我可以做到这一点,但它很丑陋。有人有更好的东西吗?
distance(foos, find_if(foos, foos + SIZE, mem_fun_ref(&Foo::isChecked)))
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
using namespace std;
#define SIZE 42
class Foo{
bool checked;
public:
Foo() : checked(false) {}
void setChecked() { checked = true; }
bool isChecked() const { return checked; }
};
int main() {
Foo foos[SIZE] = {};
foos[13].setChecked();
cout << distance(foos, find_if(foos, foos + SIZE, mem_fun_ref(&Foo::isChecked))) << endl;
}
不幸的是,我的回答并不聪明,更重要的是可能不适合您的用例。但是我会制作一个 class (或结构)来保存您的 Foo 容器并保留索引。您必须存储一个额外的 int (或索引所需的任何类型),但不必计算有效对象的位置。
例如类似的东西(或者使用任何类型的容器满足您的要求,或者使用模板,如果您不仅想将它用于 Foo..):
class Foos {
private:
int _index = -1;
Foo _foos[MAXSIZE] = {};
public:
Foos(int size, int index)
{
....
}
int getIndex()
{
return _index;
}
};
//...
// then just call getIndex() when needed
给定一个对象 Foo
,它具有方法 bool isChecked() const
。假设我有 Foo foos[]
.
我保证 foos
中只有一个元素会 return true
isChecked()
,所有其他元素会 return false
。
我正在寻找一种聪明的 C++03 方法来查找 true
元素的索引。我可以做到这一点,但它很丑陋。有人有更好的东西吗?
distance(foos, find_if(foos, foos + SIZE, mem_fun_ref(&Foo::isChecked)))
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
using namespace std;
#define SIZE 42
class Foo{
bool checked;
public:
Foo() : checked(false) {}
void setChecked() { checked = true; }
bool isChecked() const { return checked; }
};
int main() {
Foo foos[SIZE] = {};
foos[13].setChecked();
cout << distance(foos, find_if(foos, foos + SIZE, mem_fun_ref(&Foo::isChecked))) << endl;
}
不幸的是,我的回答并不聪明,更重要的是可能不适合您的用例。但是我会制作一个 class (或结构)来保存您的 Foo 容器并保留索引。您必须存储一个额外的 int (或索引所需的任何类型),但不必计算有效对象的位置。
例如类似的东西(或者使用任何类型的容器满足您的要求,或者使用模板,如果您不仅想将它用于 Foo..):
class Foos {
private:
int _index = -1;
Foo _foos[MAXSIZE] = {};
public:
Foos(int size, int index)
{
....
}
int getIndex()
{
return _index;
}
};
//...
// then just call getIndex() when needed