Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;容器在向末尾添加元素时非常有效 我一直在运行一个C++程序,用于科学目的,现在我正在寻找优化它。_C++_Vector_Containers - Fatal编程技术网

c++;容器在向末尾添加元素时非常有效 我一直在运行一个C++程序,用于科学目的,现在我正在寻找优化它。

c++;容器在向末尾添加元素时非常有效 我一直在运行一个C++程序,用于科学目的,现在我正在寻找优化它。,c++,vector,containers,C++,Vector,Containers,瓶颈似乎是一个我需要堆叠成对整数的函数。从一开始就不可能知道它们的编号,我一直在使用一个自定义结构的std::vector,该结构包含两个int。是否有一个更有效的数据容器用于在末尾重复添加元素?我应该将它与两个int一起使用,而不是成对或自定义结构吗 编辑: 在对我的程序进行计时和分析之后,我可以说,就我的使用而言,vector比deque稍快一点(仅3%)。我的外行结论是CPU充分利用了数据的连续性。优化对我来说比以往任何时候都更像是一种魔法!对这些可能会有帮助:我实际上是通过从STL C+

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

编辑:
在对我的程序进行计时和分析之后,我可以说,就我的使用而言,
vector
deque
稍快一点(仅3%)。我的外行结论是CPU充分利用了数据的连续性。优化对我来说比以往任何时候都更像是一种魔法!对这些可能会有帮助:我实际上是通过从STL C++ 11随机数发生器转换为Boost一个来显著提高我的运行时间。

< P>你必须做的重排对数的代价是<强>不相关的< /强>。但是,您可以考虑使用<代码> STD::DeQue/Cuff>,保证在前面和结尾插入<代码> O(1)< /代码>插入。您将失去连续性,但会保留一些缓存友好性。一个
deque
通常是一个不错的折衷方案,特别是当你需要从前面弹出时


还可以考虑估计向量将存储的元素数量,并使用
reserve
。但是,请注意不要浪费太多内存,否则会产生相反的效果。

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

在您的情况下,您可以使用
std::deque
std::pair
(在
中定义)来满足您的需要:

// 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
//小示例:
德克德克;
deq.推回({12344321});

cout-Related:您需要如何访问数据?您需要从前面、后面或中间访问它吗?此信息对于确定要使用的容器非常重要。有一个用于保存一对整数的
std::pair
。您不需要创建自己的结构来保存它。至于选择用于快速追加的数据结构,则有整个卷。但是,理论上的快速(例如链表)最终可能会被现代CPU缓存策略破坏,因此您可能必须尝试各种容器和基准测试,直到您得到满意的解决方案。
std::vector
很好,尝试在已知资源估计的情况下战略性地使用
reserve
,避免破坏和重建载体。@bastien不一定。
std::list
将为每个节点分配动态内存,并且您的数据可能分散在内存中
std::vector
在向量的末尾有一个摊销的O(1)插入,在按顺序访问元素时,您将有更好的内存局部性。(CPU喜欢按顺序访问内存…)这方面的研究很好:谢谢你的建议,我将对两者进行基准测试,看看是否有改进。我曾想过调用reserve,但后来我意识到我不知道最终大小的分布或平均值,并且使用非常大的值在计时时效率很低。非常感谢!!记住也要遵循@KerrekSB的建议,即如果可能,重用向量。