基于对象</object>的成员变量在stl :: set <object>中查找元素

时间:2012-11-02 19:48:25

标签: c++ stl set

我试过这个但是找不到合适的答案。我有一个自定义类的stl :: set。

该课程类似于

class myObject{

public:
  int a;
  int b;
  int c;

// constructor and operator < ()
}

&lt;比较基于bc,但我希望通过a找到集合中的元素。除了通过遍历集合并检查myObject.a执行线性搜索之外,还有其他方法吗?我正在尝试获取myObject的已排序容器,但我需要能够通过标识符a找到该容器中的元素,该标识符并未真正包含在&lt;比较。

1 个答案:

答案 0 :(得分:2)

你可以使用boost :: multi_index_container

来做到这一点
class myObject
{
public:
    int a;
    int b;
    int c;
    bool operator < (const myObject& obj) const
    { return b < obj.b; }
};

using namespace boost::multi_index;
typedef multi_index_container<
    myObject,
    indexed_by<
        ordered_unique<identity<myObject> >, // index by operator <
        ordered_unique<member<myObject, int, &myObject::a> > // index by member a
  > 
> SetOfmyObjects;

typedef SetOfmyObjects::nth_index<0>::type SetIndex_b;
typedef SetOfmyObjects::nth_index<1>::type SetIndex_a;

...

    SetOfmyObjects s;
    const SetIndex_b& index_b = s.get<0>();
    SetIndex_b::iterator it_b;
    for (it_b = index_b.begin(); it_b != index_b.end(); ++it_b)
        // ordered by b
    const SetIndex_a& index_a = s.get<1>();
    SetIndex_a::iterator it_a;
    for (it_a = index_a.begin(); it_a != index_a.end(); ++it_a)
        // ordered by a