std :: set_union vector >

问题描述 投票:0回答:1

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.