gpt4 book ai didi

c++ - std::set_union vector <对<字符串,字符串>>

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:59:59 34 4
gpt4 key购买 nike

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

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;
}

最佳答案

合并在 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; });

注意事项一:

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

我会使用 v.reserveback_inserter(v)而是分配 vector 并使用 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

关于c++ - std::set_union vector <对<字符串,字符串>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24324054/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com