我一直在运行一个用于科学目的的c ++程序,现在我正在考虑优化它。
瓶颈似乎是我需要堆叠整数对的函数。从一开始就无法知道它们的数量,我一直在使用std::vector
自定义结构,其中包含两个ints
。是否有更高效的数据容器可以在最后重复添加元素?我应该使用两个ints
而不是一对或自定义结构吗?
编辑:
在对我的计划进行计时和分析之后,我可以说,对于我的使用,vector
比deque
略快(仅为3%)。我的外行结论是CPU充分利用了数据的连续性。优化对我来说比以往任何时候都更具魔力!对于那些它可能有所帮助:我实际上通过从STL C ++ 11随机数发生器切换到BOOST来显着改善了我的运行时间。
答案 0 :(得分:10)
您必须做的对数重新分配的成本可以说无关紧要。但是,您可以考虑使用保证std::deque
插入前端和末端的O(1)
。您将失去连续性,但保留一些缓存友好性。 deque
通常是一个不错的权衡,特别是如果你需要从前面弹出。
还要考虑估计矢量将存储的元素数量,并使用reserve
。但要小心,不要浪费太多记忆,否则会产生相反的效果。
答案 1 :(得分:2)
正如gd1已经提到的,std::deque
(双端队列)允许在两端快速插入和删除。此外,在双端队列的任何一端插入和删除都不会使指针或引用无效。
在您的情况下,您可以使用std::deque
与std::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