连接两个向量的最好方法是什么?

我正在使用multithreading,并希望合并结果。 例如:

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

我希望AB要按照A的内容和B的内容。 做这样的事情最有效的方法是什么?

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

这正是成员函数std::vector::insert的用途

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

取决于你是否真的需要物理连接这两个向量,或者你想给出迭代的连接外观。 boost :: join函数

http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html

会给你这个

 std::vector<int> v0; v0.push_back(1); v0.push_back(2); v0.push_back(3); std::vector<int> v1; v1.push_back(4); v1.push_back(5); v1.push_back(6); ... BOOST_FOREACH(const int & i, boost::join(v0, v1)){ cout << i << endl; } 

应该给你

 1 2 3 4 5 6 

注意boost :: join不会将这两个向量复制到一个新的容器中,但会生成一对覆盖两个容器跨度的迭代器(范围)。 会有一些性能开销,但可能不会将所有数据先复制到新的容器。

基于Kiril V. Lyadvinsky的回答 ,我做了一个新的版本。 这段代码使用模板和重载。 有了它,你可以写vector3 = vector1 + vector2vector4 += vector3 。 希望它可以帮助。

 template <typename T> std::vector<T> operator+(const std::vector<T> &A, const std::vector<T> &B) { std::vector<T> AB; AB.reserve( A.size() + B.size() ); // preallocate memory AB.insert( AB.end(), A.begin(), A.end() ); // add A; AB.insert( AB.end(), B.begin(), B.end() ); // add B; return AB; } template <typename T> std::vector<T> &operator+=(std::vector<T> &A, const std::vector<T> &B) { A.reserve( A.size() + B.size() ); // preallocate memory without erase original data A.insert( A.end(), B.begin(), B.end() ); // add B; return A; // here A could be named AB } 

还没有提到喷气机的一个更简单的变种:

 copy(A.begin(),A.end(),std::back_inserter(AB)); copy(B.begin(),B.end(),std::back_inserter(AB)); 

并使用合并algorithm:



#include <algorithm> #include <vector> #include <iterator> #include <iostream> #include <sstream> #include <string> template<template<typename, typename...> class Container, class T> std::string toString(const Container<T>& v) { std::stringstream ss; std::copy(v.begin(), v.end(), std::ostream_iterator<T>(ss, "")); return ss.str(); }; int main() { std::vector<int> A(10); std::vector<int> B(5); //zero filled std::vector<int> AB(15); std::for_each(A.begin(), A.end(), [](int& f)->void { f = rand() % 100; }); std::cout << "before merge: " << toString(A) << "\n"; std::cout << "before merge: " << toString(B) << "\n"; merge(B.begin(),B.end(), begin(A), end(A), AB.begin(), [](int&,int&)->bool {}); std::cout << "after merge: " << toString(AB) << "\n"; return 1; }

如果您的向量是sorting*,请检查set_union从<algorithm>。

 set_union(A.begin(), A.end(), B.begin(), B.end(), AB.begin()); 

链接中有一个更彻底的例子

*谢谢rlbond

所有的解决scheme都是正确的,但是我发现它更容易编写一个函数来实现这一点。 喜欢这个:

 template <class T1, class T2> void ContainerInsert(T1 t1, T2 t2) { t1->insert(t1->end(), t2->begin(), t2->end()); } 

这样你可以避免这样的临时安置:

 ContainerInsert(vec, GetSomeVector());