c++容器非常有效地将元素添加到末尾
c++ container very efficient at adding elements to the end
我一直在为科学目的运行一个c++程序,现在我正在考虑优化它。
瓶颈似乎是一个我需要堆叠整数对的函数。它们的数量从一开始就不可能知道,我一直在使用包含两个ints
的自定义结构的std::vector
。是否有一个更有效的数据容器在末尾重复添加元素?我应该使用它与两个ints
而不是一对或自定义结构?
编辑:在对我的程序进行计时和分析之后,我可以说,在我的使用中,vector
比deque
稍微快一点(仅快3%)。我的外行结论是,CPU很好地利用了数据的连续性。优化对我来说比以往任何时候都更神奇!对于那些可能有所帮助的人:通过从STL c++ 11随机数生成器切换到BOOST生成器,我实际上大大改善了我的运行时间。
必须进行的对数重新分配的成本可以说是无关的。但是,您可以考虑使用std::deque
来保证O(1)
插入在前面和末尾。您将失去连续性,但是保留了一些缓存友好性。deque
通常是一个不错的权衡,特别是如果你需要从前面弹出。
还考虑估计vector将存储的元素数,并使用reserve
。但是要注意不要浪费太多的内存,否则会得到相反的效果。
正如gd1已经提到的,std::deque
(双端队列)允许在两端快速插入和删除。此外,在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
相关文章:
- 有没有办法向这个向量添加元素?
- 如何在提升间进程中构建具有给定计数的向量并向其添加元素
- 如何在 Arduino 字符串的开头添加元素.类似于 JS unshift();
- C++向数组添加元素并调整数组大小
- 我无法向 c++ 添加元素
- BST 不添加元素
- 调整数组大小并添加元素 C++
- 向向量添加元素
- 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
- 双链接列表添加元素不起作用,不知何故它总是保持为空
- 当我向 vector<int *> 添加元素时,我遇到了一些问题
- 动态地添加元素
- 静态2D数组,添加元素
- 在一个类中向向量添加元素不适用于其他类
- 在数组中添加元素将不接受类似的元素
- STD :: MAP-使用下标操作员与插入方法添加元素
- 动态数组添加元素而不创建结构变量/对象
- 以下向 c++ 向量添加元素的方法有什么区别
- 如何在 std::map 中添加元素自己进行分配
- C++在向量中添加元素的双精度