c++容器非常有效地将元素添加到末尾

c++ container very efficient at adding elements to the end

本文关键字:添加 元素 非常 有效地 c++      更新时间:2023-10-16

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

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

编辑:在对我的程序进行计时和分析之后,我可以说,在我的使用中,vectordeque稍微快一点(仅快3%)。我的外行结论是,CPU很好地利用了数据的连续性。优化对我来说比以往任何时候都更神奇!对于那些可能有所帮助的人:通过从STL c++ 11随机数生成器切换到BOOST生成器,我实际上大大改善了我的运行时间。

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

还考虑估计vector将存储的元素数,并使用reserve。但是要注意不要浪费太多的内存,否则会得到相反的效果。

正如gd1已经提到的,std::deque(双端队列)允许在两端快速插入和删除。此外,在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