std :: set_union vector <pair <string,string>&gt; </pair <string,string>

时间:2014-06-20 09:26:58

标签: c++ algorithm stl set-union

我想计算两个向量之间的联合:

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

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

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

1 个答案:

答案 0 :(得分:2)

联盟在pair s上完成,默认为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

类似