0

2 つのベクトル間の結合を計算したい:

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

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

問題は、結合が最初の要素ではなく 2 番目の要素で行われるのはなぜですか? ユニオンのサイズは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

結合は で行われ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.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 に答える