Что лучший способ состоит в том, чтобы связать два вектора?

Я использую мультипоступь и хочу объединить результаты. Например:

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

Я хочу, чтобы AB имел к содержанию A и содержанию B в том порядке. Каков самый эффективный способ сделать что-то вроде этого?

173
задан royhowie 24 November 2015 в 09:00
поделиться

4 ответа

AB.reserve( A.size() + B.size() ); // preallocate memory
AB.insert( AB.end(), A.begin(), A.end() );
AB.insert( AB.end(), B.begin(), B.end() );
291
ответ дан 23 November 2019 в 20:35
поделиться

Именно для этого и предназначена функция-член std::vector::insert

std::vector<int> AB = A;
AB.insert(AB.end(), B.begin(), B.end());
54
ответ дан 23 November 2019 в 20:35
поделиться

Зависит от того, действительно ли вам нужно физически объединить два вектора или вы хотите создать видимость объединения ради итерации. Функция 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), которые охватывают диапазон оба контейнера. Это приведет к некоторому увеличению производительности, но, возможно меньше, чем при копировании всех данных в новый контейнер.

26
ответ дан 23 November 2019 в 20:35
поделиться

Если ваши векторы отсортированы *, посмотрите set_union из .

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

Более подробный пример можно найти по ссылке

* спасибо rlbond

-1
ответ дан 23 November 2019 в 20:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: