0

我想计算两个向量之间的并集:

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

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

问题是为什么联合是在第二个元素而不是第一个元素上完成的?union 的大小应该等于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;
}
4

1 回答 1

2

并集在pairs 上完成,默认为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:

您还应该命名您的 lamda,而不是多次输入。

我会使用v.reserveback_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

于 2014-06-20T09:33:44.230 回答