【发布时间】:2014-05-28 12:44:01
【问题描述】:
假设我们有一个map,其中包含更大的对象和一个索引值。索引值也是较大对象的一部分。
我想知道的是是否可以将map替换为set,提取索引值。
创建一个set 相当容易,它通过提取索引值对比较两个较大对象的仿函数进行排序。
这会留下按索引值搜索,我认为set 默认不支持。
我在考虑使用std::find_if,但我相信搜索是线性的,忽略了我们设置的事实。
然后我想到使用std::binary_search 和一个比较较大对象和值的函子,但我相信它在这种情况下不起作用,因为它不会利用结构并且会使用遍历没有随机访问迭代器。它是否正确?或者是否有重载可以正确处理set 上的这个调用?
最后我在考虑使用boost::containter::flat_set,因为它有一个底层向量,因此应该能够很好地与std::binary_search一起工作?
但也许有更简单的方法来做到这一点?
在您回答之前,只需在应该使用地图的地方使用地图 - 我实际上正在使用手动排序的矢量(好吧std::lower_bound)并且正在考虑用boost::containter::flat_set替换它,但它没有似乎很容易做到这一点,所以我可能会坚持使用矢量。
【问题讨论】:
-
即使在阅读了你所有的问题之后,我也看不出你为什么不能使用
std::map或std::unordered_map... -
@Cookie:看来你完全误解了 matts fud 传播咆哮。
-
std::set和std::map只是彼此的变体:链接的 pdf 基本上同样适用于两者。核心问题是“你什么时候插入?与查找相比,你插入的频率是多少?当你迭代它时,元素的顺序是否重要?你需要容器的廉价副本吗?索引是对象身份的组成部分吗?有没有?元素多吗?boost过敏吗?你有不止一个指标吗?”