连接两个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));
当a
和b
不重叠时, 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>
的连接,那么可能会有更好的东西提供给你,如果:
- 你的
vector
包含原语 - 您包含的原语大小为32位或更小
- 你想要一个
const
容器
如果上述都是真的,我build议使用char_type
的basic_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());
有关string
和vector
之间的差异的更多信息,你可以看看这里: 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());