Кажется, есть небольшое недоразумение относительно оператора сравнения std::set_intersection
. Функция компаратора (или лямбда) должна возвращать 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.)