This question already has answers here:
Appending a vector to a vector [duplicate]

(4个答案)


2年前关闭。



std::vector<int> a;
std::vector<int> b;
std::vector<int> c;

我想通过将bc的元素附加到a来连接这三个 vector 。最好的方法是哪种,为什么?

1)通过使用vector::insert:
a.reserve(a.size() + b.size() + c.size());
a.insert(a.end(), b.begin(), b.end());
a.insert(a.end(), c.begin(), c.end());
b.clear();
c.clear();

2)通过使用std::copy:
a.reserve(a.size() + b.size() + c.size());
std::copy(b.begin(), b.end(), std::inserter(a, a.end()));
std::copy(c.begin(), c.end(), std::inserter(a, a.end()));
b.clear();
c.clear();

3)通过使用std::move(来自C++11):
a.reserve(a.size() + b.size() + c.size());
std::move(b.begin(), b.end(), std::inserter(a, a.end()));
std::move(c.begin(), c.end(), std::inserter(a, a.end()));
b.clear();
c.clear();

最佳答案

我认为,您的第一个解决方案是最好的方法。
vector<>::insert旨在添加元素,因此它是最合适的解决方案。

您可以在目标 vector 上调用reserve来保留一些空间,但是除非一起添加许多 vector ,否则它可能不会提供很多好处:vector<>::insert知道将添加多少个元素,因此您将避免只进行一次reserve调用。

注意:如果这些类型的vector是更复杂的类型(即自定义类,甚至是std::string),那么使用std::move可以为您提供很好的性能提升,因为它可以避免使用复制构造函数。但是,对于int的 vector ,它不会给您带来任何好处。

注意2:值得一提的是,使用std::move将导致源vector的内容不可用。

10-05 20:59
查看更多