C++ set::find by 对象属性

标签 c++ qt boost dictionary unordered-map

我有一个 objectproperty ,这是此对象的方法所必需的:

class Object {
   Property property;
}

然后我需要对这个对象进行分组。要求在这个组中只有具有唯一属性的对象。将此对象分组在 set 中是很自然的.我定义了一个 operator<或者如果它是 unordered_set operator==hash() .没关系。那么另一个问题出现了。我需要使用 property 在集合中找到这些对象.所以我需要创建一个 Object 类型的对象将此属性分配给它的字段。这就是我不喜欢的地方。

另一种方法是制作 map .并复制或指向对象的属性,然后将它们用作 map 中的键。我认为这也是一个双重工作。

我想要类似 set 的东西,但能够不使用整个对象进行搜索,而是使用对象的属性来查找它。例如,我定义了以下内容:

class Object {
   Property property;
   bool operator<(Object obj) { return property < obj.property; }
   bool operator<(Property obj) { return property < obj.property; }
};
some::set<Object> objSet;

然后我可以执行以下操作:

Object obj;
objSet.insert(obj);
objSet.find(obj.property);

你能提供一些对我有帮助的容器实现吗? boost, qt 是可以接受的。

最佳答案

Boost Multi-Index array可能是你需要的。本例 multiple sort on a single set非常符合您的需求。

typedef multi_index_container<
  Object,
  indexed_by<
    ordered_unique<member<Object,Property,&Object::property> >
  > 
> object_set;

object_set oset;
Property prop;
oset.find( prop );

关于C++ set::find by 对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15145342/

相关文章:

c++ - 所以我给自己弄了一个线程池任务管理器系统。我应该从现在开始只使用它来创建所有线程吗?

c++ - RemoveDuplicates 仅在位置为 1 和 2 时删除

c++ - 为什么 std::bad_cast 被 boost::locale 抛出?

c++ - Qt和C++:覆盖或扩展类

c++ - 将智能指针放入 STL 容器中

c++ - _block_type_is_valid(phead- nblockuse) 从 shared_ptr 的 vector 中删除数据时

c++ - 在 Linux 上的命令行上编译 QObject 派生类

qt - 如何根据 Qt 中的分隔符拆分字符串?

C++ Boost 侵入列表 - 示例

c++ - 为什么我不能从函数返回 Boost::Scoped_ptr?