繁体   English   中英

连接两个std :: vector - 哪种方法更有效,怎么/为什么?

[英]Concatenating two std::vector — which method is more efficient and how/why?

请考虑以下情形:

std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;

我希望AB以相同的顺序包含A的内容,然后是B的内容。

方法1:

AB.reserve( A.size() + B.size() ); // preallocate memory
AB.insert( AB.end(), A.begin(), A.end() );
AB.insert( AB.end(), B.begin(), B.end() );

方法2:

std::vector<int> AB ( A.begin(), A.end() ); // calling constructor
AB.insert ( AB.end(), B.begin(), B.end() );

以上哪种方法效率更高? 为什么? 是否有更高效的不同方法?

第一个可能更有效,因为您可以保证只执行一次内存分配。 在第二个中,很可能(大多数实现都会)在向量构造期间完成A.size()的分配,然后insert将触发第二个分配,因为它需要通过B.size()元素增长。

方法1个执行重新分配,而方法2可以重新分配几次,将在实践中极有可能重新分配一次。 方法1更好。

我认为第一个将永远比第二个更快,因为它只执行一个内存分配,第二个可能必须重新分配至少一次。 我的测量结果似乎表明,对于小于约100,000的尺寸,这甚至更快:

std::vector<int> AB(A.size() + B.size());
std::copy(A.begin(), A.end(), AB.begin());
std::copy(B.begin(), B.end(), AB.begin() + B.size());

我猜这是因为,这不仅仅执行一次分配而且没有重新分配,甚至不需要检查它是否应该进行任何重新分配。 缺点是最初可能必须将所有内存归零,但我认为CPU很擅长。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM