我正在寻找一个容器,它允许我为排序和等价指定单独的函数。std::set
允许指定 1 个比较器功能。理想情况下,我想根据一个条件进行排序,但是在搜索集合时,我想使用另一个条件进行匹配。我通过使用存储插入到集合中的迭代器的映射来破解此解决方案。但我想知道是否有更好的方法。
2 回答
试试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 容器的接口,使使用它们变得熟悉。对同一元素集合进行多索引的概念是从关系数据库术语中借用的,它允许本着多索引关系表的精神来规范复杂的数据结构,其中简单的集合和映射是不够的。提供了广泛的索引选择,模仿类似的 STL 容器,如 std::set、std::list 和散列集。
Boost.MultiIndex 具有额外的功能,例如子对象搜索、范围查询和元素的就地更新,即使在不需要多索引功能时,它也可以方便地替代 std::set 和 set::multiset。
它完全支持您正在寻找的内容。请参阅多重排序部分。
要么使用两个容器(您手动保持同步),要么使用boost::multi_index
.
由于 a 中的元素set
永远不会重新定位并且迭代器永远不会失效,因此您使用 key->iterator 映射的解决方案可能与任何其他双容器解决方案一样好。您也许可以存储 key->pointer 的映射。
或者当然您可以只使用, 并使用orstd::set
搜索元素。搜索将花费与集合大小成线性关系的时间。std::find
std::find_if