我正在寻找一个允许我为排序和等价指定单独函数的容器。 std::set
允许指定1个比较器函数。
理想情况下,我想按标准排序,但搜索集合,我想使用另一个标准进行匹配。我通过使用存储插入到集合中的迭代器的映射来破解此解决方案。但我想知道是否有更好的方法。
答案 0 :(得分:4)
试试boost::multi_index_container
:http://www.boost.org/doc/libs/1_53_0/libs/multi_index/doc/index.html
Boost Multi-index Containers Library提供了一个类模板 命名为multi_index_container,可以构建 容器维护一个或多个不同排序和索引的索引 访问语义。索引提供类似于STL的接口 容器,使用它们熟悉。多索引的概念 同一个元素集合是从关系中借来的 数据库术语,允许复杂数据的规范 结构在多重索引关系表的精神中 简单的集合和地图是不够的。各种指数是 提供,模仿类似STD容器,如std :: set, std :: list和hashed sets。
Boost.MultiIndex具有其他功能,如子对象 搜索,范围查询和元素的就地更新 使它成为std :: set和set :: multiset的便捷替代品 当不需要多索引功能时。
它完全支持您正在寻找的内容。请参阅multiple sorting。
部分答案 1 :(得分:2)
使用两个容器(手动保持同步)或boost::multi_index
。
由于set
中的元素永远不会重定位且迭代器永远不会失效,因此使用key->迭代器映射的解决方案可能与任何其他双容器解决方案一样好。你也许可以存储一个key->指针的地图。
当然,您只能使用std::set
,并使用std::find
或std::find_if
搜索元素。搜索将花费时间线性的集合大小。