В случае двух векторов, каждый из которых содержит уже распределенные данные: учитывая, что вектор содержит только примитивы, каков наиболее эффективный способ объединения одного за другим без копирования чего-либо?
В этом конкретном примере оба вектора будут содержать много данных, возможно, миллионов чисел. Присвоение векторов функции по ссылке должно рассматриваться как оптимизация, поэтому нет необходимости копировать данные из каждого вектора.
Это действительно стоит того, чтобы быть мудрым во время выполнения? Согласно этому вопросу, это может и не быть.
Два возможных решения используют std :: reference_wrapper -s или указатели, что является наиболее эффективным способом для этого?
Возможное решение будет:
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>
using std::vector;
using std::reference_wrapper;
using std::for_each;
void a_function(vector<int>& a, vector<int>& b){
vector<reference_wrapper<int>> united;
united.reserve(a.size() + b.size());
united.insert(united.begin(),a.begin(),a.end());
united.insert(united.end(),b.begin(),b.end());
// ..use united..
for_each(united.begin(),united.end(),[&](int& common_vector){
++common_vector;
});
}
int main(){
vector<int> a(0);
vector<int> b(0);
a.push_back(0);
a.push_back(1);
a.push_back(2);
a.push_back(3);
for_each(a.begin(),a.end(),[&](int& common_vector){std::cout << common_vector << "; ";});
b.push_back(4);
b.push_back(5);
b.push_back(6);
b.push_back(7);
for_each(b.begin(),b.end(),[&](int& common_vector){std::cout << common_vector << "; ";});
std::cout << std::endl << "#################################################################" << std::endl;
a_function(a,b);
for_each(a.begin(),a.end(),[&](int& common_vector){std::cout << common_vector << "; ";});
for_each(b.begin(),b.end(),[&](int& common_vector){std::cout << common_vector << "; ";});
}