我试过这个但是找不到合适的答案。我有一个自定义类的stl :: set。
该课程类似于
class myObject{
public:
int a;
int b;
int c;
// constructor and operator < ()
}
&lt;比较基于b
和c
,但我希望通过a
找到集合中的元素。除了通过遍历集合并检查myObject.a
执行线性搜索之外,还有其他方法吗?我正在尝试获取myObject
的已排序容器,但我需要能够通过标识符a
找到该容器中的元素,该标识符并未真正包含在&lt;比较。
答案 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