关联容器,允许指定单独的比较器和排序仿函数

时间:2013-04-29 15:32:04

标签: c++ boost map stl set

我正在寻找一个允许我为排序和等价指定单独函数的容器。 std::set允许指定1个比较器函数。 理想情况下,我想按标准排序,但搜索集合,我想使用另一个标准进行匹配。我通过使用存储插入到集合中的迭代器的映射来破解此解决方案。但我想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:4)

试试boost::multi_index_containerhttp://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::findstd::find_if搜索元素。搜索将花费时间线性的集合大小。