C++ 查找选定对象的索引

C++ 查找选定对象的索引,c++,indexing,grouping,selecteditem,c++03,C++,Indexing,Grouping,Selecteditem,C++03,给定一个对象Foo,其方法为bool isChecked()const。假设我有Foo-foos[] 我保证在isChecked()上,只有foos的一个元素将返回true,所有其他元素将返回false 我正在寻找一种聪明的C++03方法来查找true元素的索引。我可以这样做,但是很难看。有人有更好的吗 distance(foos, find_if(foos, foos + SIZE, mem_fun_ref(&Foo::isChecked))) #include不幸的是,我的答案并

给定一个对象
Foo
,其方法为
bool isChecked()const
。假设我有
Foo-foos[]

我保证在
isChecked()
上,只有
foos
的一个元素将返回
true
,所有其他元素将返回
false

我正在寻找一种聪明的C++03方法来查找
true
元素的索引。我可以这样做,但是很难看。有人有更好的吗

distance(foos, find_if(foos, foos + SIZE, mem_fun_ref(&Foo::isChecked)))


#include

不幸的是,我的答案并不聪明,更重要的是可能不适合您的用例。但是我会创建一个类(或结构),它保存Foo容器并保留索引。您必须存储额外的int(或索引所需的任何类型),但不必计算有效对象的位置

例如,类似的东西(或者使用符合您需求的任何类型的容器,或者使用模板,如果您不想将其仅用于Foo..):


不幸的是,我的答案并不聪明,更重要的是可能不适合您的用例。但是我会创建一个类(或结构),它保存Foo容器并保留索引。您必须存储额外的int(或索引所需的任何类型),但不必计算有效对象的位置

例如,类似的东西(或者使用符合您需求的任何类型的容器,或者使用模板,如果您不想将其仅用于Foo..):


这不是太多的代码,无法在您的问题中直接显示。@πάνταῥεῖ 是的,我想要简单的优雅,但是你的权利;现在我看到了问题中的代码,这只是一个更清晰的问题。在你的问题中没有太多的代码可以直接显示出来。@πάνταῥεῖ 是的,我想要简单的优雅,但是你的权利;现在我看到了问题中的代码,这只是一个更清晰的问题。是的,这就是我当前的设计所做的。(我有一个
size\u t index
变量,我在处理
foos
时会保留该变量)这实际上可能是最好的解决方案,尽管:(我很高兴我没有走得太远。我也在考虑vector或类似的东西,这样你就不会有一个固定的大小,但这也取决于你的用例/上下文。是的,大小是固定的。这确实有一个额外的好处,
Foos
可以负责确保一次只检查一个项目,因此在ge中一般情况下,我喜欢这样,我希望我会接受。这对我来说并不是最光荣的解决方案,因为这是我的实际问题:我明白了,所以我猜你的WxWidget事件处理程序在收到事件后会更新Foos。我很久没有处理UI了,但我确实记得保持这个中介“有点”GUI的状态令人沮丧。我唯一的建议是不要在Foos中保留Foo的副本,因为它们已经保存在Wxwidget中,这可以识别radiobutton)因此,需要知道状态的逻辑可以从FOO中获取信息。是的,对我来说,这只是我所说的另一个
size\u t index
变量。整个事情感觉就像是推而不是开车:/耶,这就是我当前的设计。(我有一个
size\u t index
变量,我在处理
foos
时会保留该变量)这实际上可能是最好的解决方案,尽管:(我很高兴我没有走得太远。我也在考虑vector或类似的东西,这样你就不会有一个固定的大小,但这也取决于你的用例/上下文。是的,大小是固定的。这确实有一个额外的好处,
Foos
可以负责确保一次只检查一个项目,因此在ge中一般情况下,我喜欢这样,我希望我会接受。这对我来说并不是最光荣的解决方案,因为这是我的实际问题:我明白了,所以我猜你的WxWidget事件处理程序在收到事件后会更新Foos。我很久没有处理UI了,但我确实记得保持这个中介“有点”GUI的状态令人沮丧。我唯一的建议是不要在Foos中保留Foo的副本,因为它们已经保存在Wxwidget中,这可以识别radiobutton)因此,需要了解状态的逻辑可以从FOO中获取信息。是的,对我来说,这只是我所说的另一个
size\u t index
变量。这整件事感觉像是在推车,而不是开车:/
#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 Foos {
private:
    int _index = -1;
    Foo _foos[MAXSIZE] = {};
public:
    Foos(int size, int index)
    {
      ....
    }
    int getIndex()
    {
        return _index;
    }
};

//...
//   then just call getIndex() when needed