哪个是查找最快的STL容器?

AJG*_*G85 31 c++ optimization stl find

好的作为前言我需要缓存很少修改数据的相对较小的子集,以避免出于性能原因频繁查询数据库.这些数据大量用于只读意义,因为它通常由其他表中的更大数据集引用.

我编写了一个类,它能够在内存中基本上存储所讨论的两个表的全部内容,同时监听提交更改以及用于更新缓存对象的线程安全回调机制.

我当前的实现有两个std::vectors用于每个表的元素.该类提供两个访问每个矢量的整体以及方便的方法用于搜索通过表数据的特定元素std::find,std::find_if等.

有谁知道,如果使用std::list,std::set或者std::mapstd::vector用于搜索将是可取的?大多数情况下,在建立新连接后从数据库填充一次后将要求这些容器.

我也愿意使用VS2010或Boost支持的C++ 0x功能.

R. *_*des 53

用于搜索一个特定的值,与std::setstd::map它需要为O(log n)的时间,而与其他两个花费O(N)时间; 所以,std::set或者std::map可能更好.由于您可以访问C++ 0x,因此您也可以使用std::unordered_setstd::unordered_map平均占用一段时间.

因为find_if它们之间没什么区别,因为它需要一个任意谓词,当然容器也不能随意优化.

但是,如果您find_if经常使用某个谓词进行调用,则可以自行优化:使用std::mapstd::set使用自定义比较器或特殊键,然后使用find.

  • 对于像我这样只是来这个问题的人.我需要在一组大约100万个值上进行大约一百万次查找.使用unordered_set大约需要7秒钟来执行所有查找.使用矢量花了超过30分钟(我在找到这个答案后停止了它).这就是我喜欢stackoverflow的原因!谢谢R. Martinho Fernandes! (11认同)
  • 即使没有C++ 0x,您也可以在TR1中查找无序容器,即`#include <tr1/unordered_map>`和`std :: tr1 :: unordered_map <K,V>`.但是,你真的必须测试,因为渐近线(O(1)vs O(log n))没有告诉你常量的大小,并且在无序容器更高效之前n可能必须是巨大的! (6认同)
  • 是的,测试很重要!如果不是很多数据,"较慢"的容器可能会更好地工作.当使用无序的哈希函数时,哈希函数的质量也会有所不同. (2认同)

Mar*_*som 22

使用的排序向量std::lower_bound可以与std::set您不经常更新一样快; 他们都是O(log n).值得尝试看看哪种情况更适合您自己的情况.

  • 根据我的经验,排序的矢量明显快于集合(并且内存密集程度也较低); 明显的权衡是修改存储的数据是昂贵的.如果你需要查找不同的字段,最简单的解决方案是为每个字段设置一个不同的排序向量(可能是指针的向量,以避免重复一堆信息) (5认同)