我有两张地图
map<string, int> word_count1, word_count2;
我试图找到这两个地图之间的集合相交。在std :: algorithms中使用set_intersection方法。
map<string, int> intersection;
set_intersection(word_count1.begin(), word_count1.end(),
word_count2.begin(), word_count2.end(),
inserter(intersection, intersection.begin()),
[](pair<string, int> p1, pair<string, int>p2){
return p1.first != p2.first;
});
我已经尝试过没有word_count1.key_comp()和上面基于lambda的比较功能的比较功能。
我知道一个事实
在两个地图中都有数据。
交集不为空。
但是,当我检查相交图中的值时,我什么也没找到。
我也尝试了没有插入器的情况,并且从函数调用中返回的返回值表明没有值!我究竟做错了什么?
最佳答案
关于std::set_intersection
的比较运算符似乎有些误解。如果第一个元素小于第二个元素,则比较器函数(或lambda)必须返回true。因此,!=
和==
都不会返回正确的(即预期的)结果。更改运算符即可使用:
std::set_intersection(word_count1.begin(), word_count1.end(),
word_count2.begin(), word_count2.end(),
inserter(intersection, intersection.begin()),
[](std::pair<std::string, int> p1, std::pair<std::string, int>p2){
// Compare with less than operator here.
return p1.first < p2.first;
});
一个完整的工作示例可能是:
#include <algorithm>
#include <iostream>
#include <map>
#include <string>
int main(int argc, char** argv)
{
std::map<std::string, int> word_count1 = {
{ "foo", 1 },
{ "bar", 3 },
{ "baz", 5 }
};
std::map<std::string, int> word_count2 = {
{ "foo", 4 },
{ "qux", 2 },
{ "baz", 5 },
{ "quux", 6 }
};
std::map<std::string, int> intersection;
std::set_intersection(word_count1.begin(), word_count1.end(),
word_count2.begin(), word_count2.end(),
inserter(intersection, intersection.begin()),
[](std::pair<std::string, int> p1, std::pair<std::string, int>p2){
return p1.first < p2.first;
}
);
for(const auto & elem: intersection)
{
std::cout << elem.first << " " << elem.second << "\n";
}
}
在这种情况下,输出为:
baz 5
foo 1
(已在GCC 7.4.0中测试。)
关于c++ - 在 map 上的键上用C++设置交集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56120806/