вектор std :: set_union & lt; pair & lt; string, string & gt; & gt;

Я хочу вычислить объединение между двумя векторами:

std::vector<pair<string,string>> p1;

std::vector<pair<string,string>> p2;

Проблема в том, почему объединение выполняется для второго элемента вместо первого?
размер объединения должен быть равен 4. Можно ли изменить set_union, чтобы объединение выполнялось для первого элемента?


#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main()
{
std::vector<pair<string,string>> p1;
std::vector<pair<string,string>> p2;
p1.push_back(make_pair("A","1"));
p1.push_back(make_pair("B","2"));
p1.push_back(make_pair("C","3"));;
p2.push_back(make_pair("A","4"));
p2.push_back(make_pair("B","5"));
p2.push_back(make_pair("C","6"));
p2.push_back(make_pair("D","7"));
//sort vectors according to first element
sort(p1.begin(), p1.end(), [](const pair<string,string>& lhs, const pair<string,string>& rhs) {return lhs.first < rhs.first; });
sort(p2.begin(), p2.end(), [](const pair<string,string>& lhs, const pair<string,string>& rhs) {return lhs.first < rhs.first; });
//initialize vectors
std::vector<pair<string,string>> v(p1.size() + p2.size());
std::vector<pair<string,string>>::iterator it;
//compute union
it=std::set_union(p1.begin(), p1.end(),p2.begin(), p2.end(), v.begin());
v.resize(it-v.begin());
//print size
//size = 4
cout << v.size() << endl;
return 0;
}

0

Решение

Союз делается на pairс по умолчанию operator<, ("A", "1") отличается от ("A", "4"),

Отдай свой компаратор std::set_union для достижения ожидаемого результата:

it=std::set_union(p1.begin(), p1.end(),p2.begin(), p2.end(), v.begin(),
[](const pair<string,string>& lhs, const pair<string,string>& rhs) { return lhs.first < rhs.first; });

Обратите внимание 1:

Вы должны также назвать свою лямду вместо того, чтобы печатать ее несколько раз.

И я бы использовал v.reserve а также back_inserter(v) вместо этого выделяя вектор и используя v.begin() собрать вывод:

 (...)
//save comparator
auto comp = [](const pair<string,string>& lhs, const pair<string,string>& rhs) {return lhs.first < rhs.first; };
//sort vectors according to first element
sort(p1.begin(), p1.end(), comp);
sort(p2.begin(), p2.end(), comp);
//initialize vectors
std::vector<pair<string,string>> v;
v.reserve(p1.size() + p2.size());
//compute union
std::set_union(p1.begin(), p1.end(), p2.begin(), p2.end(), back_inserter(v), comp);
//print size
//size == 4
cout << v.size() << endl;
}

Обратите внимание 2: то, что вы делаете, похоже на std::map

2

Другие решения


По вопросам рекламы [email protected]