将带有自定义比较器的映射传递到功能

Passing map with custom comparator to function

本文关键字:功能 映射 自定义 比较器      更新时间:2023-10-16

我有一个带有自定义比较器的 STL 映射,我想将其传递给函数,但该函数无法识别自定义比较器。

尝试在主函数中访问地图是有效的。

我已经在我的代码中列出了这两种尝试。

#include <iostream>
#include <string>
#include <map>
// Error: cmpByStringLength is not recognized (both times)
void funcOut(std::map<std::string, int, cmpByStringLength> myMap)
{
  for (std::map<std::string, int, cmpByStringLength>::iterator it = myMap.begin(); it != myMap.end(); ++it)
  {
    std::cout << it->first << " => " << it->second << std::endl;
  }
}
int main()
{
  // Reverse sort by length
  struct cmpByStringLength {
    bool operator()(const std::string& a, const std::string& b) const {
      return a.length() > b.length();
    }
  };
  std::map<std::string, int, cmpByStringLength> myMap;
  myMap.emplace("String 1", 5);
  myMap.emplace("String 123", 10);
  funcOut(myMap);
  // Working
  for (std::map<std::string, int, cmpByStringLength>::iterator it = myMap.begin(); it != myMap.end(); ++it)
  {
    std::cout << it->first << " => " << it->second << std::endl;
  }
  return 0;
}

只能在声明名称后使用名称,并且仅当名称在范围内时。您的比较器类型的作用域在 main 内,因此您只能在该函数中使用它。将定义移出 main ,移动到全局命名空间(或另一个命名空间,也可以根据需要移动到另一个命名空间中),以使其在其他函数中可用。

或者,您可以将另一个函数设置为模板,以便它可以处理任何地图类型:

template <typename Map>
void funcOut(Map const & myMap) {
    // your code here
}

使用模板,因为我是一个懒惰的 c++ 开发人员(我不需要担心很多细节......我会做的..

template <typename MapType>
void funcOut(MapType& myMap)
{
  for (auto& p : myMap)
  {
    std::cout << p.first << " => " << p.second << std::endl;
  }
}