我有两张地图

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/

10-12 18:23