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

时间:2014-10-09 09:20:28

标签: c++ performance concatenation stdvector

考虑以下情况:

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() );

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

方法1执行 no 重新分配,而方法2可能会多次重新分配,并且实际上很可能会重新分配一次。所以方法1更好。

答案 2 :(得分:1)

我认为第一个将永远比第二个快,因为它只执行一次内存分配,第二次可能必须重新分配至少一次。但是my measurements似乎表明,对于大小小于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很擅长。