连接两个std ::向量

如何连接两个std::vector

 vector1.insert( vector1.end(), vector2.begin(), vector2.end() ); 

我将使用插入function ,如下所示:

 vector<int> a, b; //fill with data b.insert(b.end(), a.begin(), a.end()); 

如果您正在使用C ++ 11,并希望移动元素而不是仅仅复制元素,则可以使用std :: move_iterator( http://en.cppreference.com/w/cpp/iterator/move_iterator )以及insert (或复制):

 #include <vector> #include <iostream> #include <iterator> int main(int argc, char** argv) { std::vector<int> dest{1,2,3,4,5}; std::vector<int> src{6,7,8,9,10}; // Move elements from src to dest. // src is left in undefined but safe-to-destruct state. dest.insert( dest.end(), std::make_move_iterator(src.begin()), std::make_move_iterator(src.end()) ); // Print out concatenated vector. std::copy( dest.begin(), dest.end(), std::ostream_iterator<int>(std::cout, "\n") ); return 0; } 

对于带整数的例子来说,这样做效率并不高,因为移动它们并不比复制效率更高,但对于具有优化移动的数据结构,它可以避免复制不必要的状态:

 #include <vector> #include <iostream> #include <iterator> int main(int argc, char** argv) { std::vector<std::vector<int>> dest{{1,2,3,4,5}, {3,4}}; std::vector<std::vector<int>> src{{6,7,8,9,10}}; // Move elements from src to dest. // src is left in undefined but safe-to-destruct state. dest.insert( dest.end(), std::make_move_iterator(src.begin()), std::make_move_iterator(src.end()) ); return 0; } 

移动之后,src的元素处于一个未定义的但是可以安全销毁的状态,其原有的元素直接转移到dest的新元素上。

或者你可以使用:

 std::copy(source.begin(), source.end(), std::back_inserter(destination)); 

如果这两个向量不包含完全相同types的东西,这种模式很有用,因为您可以使用某些东西而不是std :: back_inserter从一种types转换为另一种types。

 std::vector<int> first; std::vector<int> second; first.insert(first.end(), second.begin(), second.end()); 

在C ++ 11中,我更愿意将向量b附加到:

 std::move(b.begin(), b.end(), std::back_inserter(a)); 

ab不重叠时, b不再被使用。

我更喜欢已经提到的一个:

 a.insert(a.end(), b.begin(), b.end()); 

但是如果你使用C ++ 11,还有一个更通用的方法:

 a.insert(std::end(a), std::begin(b), std::end(b)); 

此外,不是问题的一部分,但build议在追加更好的性能之前使用reserve 。 如果你将vector与自身连接起来,而不保留它,那么你总是应该reserve


所以基本上你需要:

 template <typename T> void Append(std::vector<T>& a, const std::vector<T>& b) { a.reserve(a.size() + b.size()); a.insert(a.end(), b.begin(), b.end()); } 

如果您对强大的exception保证感兴趣(当复制构造函数可以抛出exception时):

 template<typename T> inline void append_copy(std::vector<T>& v1, const std::vector<T>& v2) { const auto orig_v1_size = v1.size(); v1.reserve(orig_v1_size + v2.size()); try { v1.insert(v1.end(), v2.begin(), v2.end()); } catch(...) { v1.erase(v1.begin() + orig_v1_size, v1.end()); throw; } } 

如果向量元素的移动构造函数可以抛出(这不太可能,但仍然),但具有强保证的类似append_move

 vector<int> v1 = {1, 2, 3, 4, 5}; vector<int> v2 = {11, 12, 13, 14, 15}; copy(v2.begin(), v2.end(), back_inserter(v1)); 

你应该使用vector :: insert

 v1.insert(v1.end(), v2.begin(), v2.end()); 

把这个添加到你的头文件中:

 template <typename T> vector<T> concat(vector<T> &a, vector<T> &b) { vector<T> ret = vector<T>(); copy(a.begin(), a.end(), back_inserter(ret)); copy(b.begin(), b.end(), back_inserter(ret)); return ret; } 

并以这种方式使用它:

 vector<int> a = vector<int>(); vector<int> b = vector<int>(); a.push_back(1); a.push_back(2); b.push_back(62); vector<int> r = concat(a, b); 

r将包含[1,2,62]

随着范围v3 ,你可能有一个懒惰的连接:

 ranges::view::concat(v1, v2) 

演示 。

如果你正在寻找的是在创build后向另一个添加一个向量的方法, vector::insert是你最好的select,就像已经回答了好几次,例如:

 vector<int> first = {13}; const vector<int> second = {42}; first.insert(first.end(), second.cbegin(), second.cend()); 

可悲的是,没有办法构build一个const vector<int> ,如上所示,你必须构造并insert


如果你正在寻找的是一个容器来容纳这两个vector<int>的连接,那么可能会有更好的东西提供给你,如果:

  1. 你的vector包含原语
  2. 您包含的原语大小为32位或更小
  3. 你想要一个const容器

如果上述都是真的,我build议使用char_typebasic_string匹配vector包含的原始大小。 您应该在代码中包含一个static_assert来validation这些大小保持一致:

 static_assert(sizeof(char32_t) == sizeof(int)); 

在这种情况下,你可以这样做:

 const u32string concatenation = u32string(first.cbegin(), first.cend()) + u32string(second.cbegin(), second.cend()); 

有关stringvector之间的差异的更多信息,你可以看看这里: https : //stackoverflow.com/a/35558008/2642059

对于这个代码的生动的例子,你可以看看这里: http : //ideone.com/7Iww3I

说实话,你可以通过两个向量的复制元素将两个向量连接成另一个向量,或者只是追加两个向量中的一个! 这取决于你的目标。

方法1:分配新的向量,其大小是两个原始向量大小的总和。

 vector<int> concat_vector = vector<int>(); concat_vector.setcapacity(vector_A.size() + vector_B.size()); // Loop for copy elements in two vectors into concat_vector 

方法2:通过添加/插入向量B的元素来追加向量A.

 // Loop for insert elements of vector_B into vector_A with insert() function: vector_A.insert(vector_A .end(), vector_B.cbegin(), vector_B.cend());