c ++容器在向末尾添加元素时非常有效

时间:2015-06-09 15:04:46

标签: c++ vector containers

我一直在运行一个用于科学目的的c ++程序,现在我正在考虑优化它。

瓶颈似乎是我需要堆叠整数对的函数。从一开始就无法知道它们的数量,我一直在使用std::vector自定义结构,其中包含两个ints。是否有更高效的数据容器可以在最后重复添加元素?我应该使用两个ints而不是一对或自定义结构吗?

编辑: 在对我的计划进行计时和分析之后,我可以说,对于我的使用,vectordeque略快(仅为3%)。我的外行结论是CPU充分利用了数据的连续性。优化对我来说比以往任何时候都更具魔力!对于那些它可能有所帮助:我实际上通过从STL C ++ 11随机数发生器切换到BOOST来显着改善了我的运行时间。

2 个答案:

答案 0 :(得分:10)

您必须做的对数重新分配的成本可以说无关紧要。但是,您可以考虑使用保证std::deque插入前端和末端的O(1)。您将失去连续性,但保留一些缓存友好性。 deque通常是一个不错的权衡,特别是如果你需要从前面弹出。

还要考虑估计矢量将存储的元素数量,并使用reserve。但要小心,不要浪费太多记忆,否则会产生相反的效果。

答案 1 :(得分:2)

正如gd1已经提到的,std::deque(双端队列)允许在两端快速插入和删除。此外,在双端队列的任何一端插入和删除都不会使指针或引用无效。

在您的情况下,您可以使用std::dequestd::pair(在<utility>中定义)来满足您的需求:

// Small example:
deque<pair<int, int>> deq;
deq.push_back({1234, 4321});
cout << deq.at(0).first << " " << deq.at(0).second;

// using 'at' above, should normally be inside a try block as it may throw 
// out_of_range exception