Я использую мультипоступь и хочу объединить результаты. Например:
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 не копирует два вектора в новый контейнер. но генерирует пару итераторов (range), которые охватывают диапазон оба контейнера. Это приведет к некоторому увеличению производительности, но, возможно меньше, чем при копировании всех данных в новый контейнер.
Если ваши векторы отсортированы *, посмотрите set_union из
set_union(A.begin(), A.end(), B.begin(), B.end(), AB.begin());
Более подробный пример можно найти по ссылке
* спасибо rlbond