Я использую многопоточность и хочу объединить результаты. Например:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
Я хочу, чтобы AB содержал содержимое A и содержимое B в указанном порядке. Какой самый эффективный способ сделать что-то подобное?
Ответы:
источник
Это именно то , что функция член
std::vector::insert
дляисточник
insert
на итераторах с произвольным доступом и зарезервирована заранее .distance
имеет сложность O (1)). Тем не менее, гарантии производительностиinsert
- это то, о чем следует помнить, когда вы часто можете добиться большего успеха, планируя заранее.size < capacity
большинстве случаев предсказание ветвления, скорее всего, приведет к тому, что команды нераспределенного ветвления окажутся в конвейере команд, что минимизирует задержку, вызванную ветвлением, за исключением низкого количества итераций. Это предполагает хорошую векторную реализацию, плюс конвейер инструкций процессора и [хорошее] предсказание ветвлений, но это довольно надежные предположения для современного набора инструментов и настольного компьютера. Не знаю, как насчет смартфонов ..Зависит от того, действительно ли вам нужно физически объединить два вектора или вы хотите создать вид конкатенации ради итерации. Функция boost :: join
http://www.boost.org/doc/libs/1_43_0/libs/range/doc/html/range/reference/utilities/join.html
даст вам это.
должен дать вам
Обратите внимание, что boost :: join не копирует два вектора в новый контейнер, но генерирует пару итераторов (диапазон), которые охватывают диапазон обоих контейнеров. Это приведет к некоторому снижению производительности, но, возможно, будет меньше, если сначала скопировать все данные в новый контейнер.
источник
Исходя из ответа Кирилла Лядвинского , я сделал новую версию. Этот фрагмент использования шаблона и перегрузки. С его помощью вы можете написать
vector3 = vector1 + vector2
иvector4 += vector3
. Надеюсь, это поможет.источник
::
принято;)v1 + v2
не представляет собой сложение.@
как в F #В направлении ответа Bradgonesurfing, часто не нужно объединять два вектора (O (n)), а просто работать с ними, как если бы они были объединены (O (1)) . Если это ваш случай, это можно сделать без использования библиотек Boost.
Хитрость заключается в том, чтобы создать векторный прокси: класс-обертка, который манипулирует ссылками на оба вектора, внешне рассматриваемый как один, непрерывный.
ИСПОЛЬЗОВАНИЕ
РЕАЛИЗАЦИЯ
ОСНОВНАЯ ВЫГОДА
Это O (1) (постоянное время) для его создания и с минимальным выделением дополнительной памяти.
НЕКОТОРЫЕ ВЕЩИ ДЛЯ РАССМОТРЕНИЯ
источник
Еще один простой вариант, который еще не был упомянут:
И используя алгоритм слияния:
источник
Если ваши векторы отсортированы *, посмотрите set_union из <алгоритма>.
В ссылке есть более подробный пример
* спасибо Rlbond
источник
Все решения правильные, но мне было проще написать функцию для реализации этого. как это:
Таким образом, вы можете избежать временного размещения, как это:
источник