STL: соединить два вектора
подскажите, возможно ли вообще решить такую задачу:
есть два вектора пар
using pairs_t = std::vector<std::pair<T1, T2>>;
pairs_t data1, data2;
требуется пройти по всем элементам этих двух векторов
решением является собрать новый вектор из двух:
pairs_t data_total;
data_total.insert(std::end(data_total), std::begin(data1), std::end(data1));
data_total.insert(std::end(data_total), std::begin(data2), std::end(data2));
Вопрос: а можно ли не собирать для этой цели отдельный вектор, чтобы избежать ненужных копирований, удалений и т.д.?
и конечно не подходит вариант отдельного обхода векторов
for (const auto& obj : data1) {...}
for (const auto& obj : data2) {...}
нужно именно обойти оба вектора так так сказать как единого целого
P.S.
наверное подойдет и промежуточный вариант - собрать новый вектор, но не элементов, а ссылок на элементы, т.е. никаких лишних операций с типами Т1, Т2 происходить не будет
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
Долго мучался, нарисовал итератор. Посмотрите, может понравиться:
// g++ -std=c++11 -Wall -Wextra -Wpedantic -Os vecpai.cpp -o vecpai
# include <vector>
# include <iostream>
template <class T1,class T2>
using pairs_t = std::vector<std::pair<T1, T2>>;
template <class T1,class T2>
class MergeIterator {
public :
MergeIterator(pairs_t<T1, T2>&a,pairs_t<T1, T2>&b):da{a},db{b}{
start();}
void start(void){
it = da.begin();
if(it == da.end())
it = db.begin();}
operator bool(){return it not_eq db.end();}
MergeIterator<T1,T2> operator ++(void){
++ it;
if(it == da.end())
it = db.begin();
return *this;}
std::pair<T1, T2> & operator * (){return * it;}
private:
pairs_t<T1, T2> & da ;
pairs_t<T1, T2> & db ;
typename pairs_t<T1, T2>::iterator it ;
};
int main(){
pairs_t<int, char> data1{{1,'a'},{2,'b'}}, data2{{3,'c'},{4,'d'}};
for (MergeIterator<int , char> i{data1,data2};i;++i)
std::cout<<"("<<(*i).first<<","<<(*i).second<<")"<<std::endl;
}
тест :
$ ./vecpai
(1,a)
(2,b)
(3,c)
(4,d)