将带有自定义比较器的映射传递到功能
Passing map with custom comparator to function
我有一个带有自定义比较器的 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;
}
}
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 多态性和功能结合
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何编写用于多映射插入和擦除功能的 API?
- 模板功能以映射特定类型,并保留所有其他不变的
- 将打开的CV的重映射功能与类型CV_8SC1的源图像一起使用
- 具有C 的功能JavaScript样式的映射
- 我如何将输入分配给在 for 循环中设置的映射功能
- 如何在C 11中创建指针映射以静态成员功能
- C++工具,具有与Python的过滤器和映射相同的功能
- 映射与对象键,查找和比较功能
- 将带有自定义比较器的映射传递到功能
- 成员功能作为映射比较器
- OpenCV 中的重映射功能如何用于不失真的图像
- 导出映射是否可以仅选择要链接到的功能
- visual 从映射C++中的功能指针调用函数
- 功能映射图
- 映射和设置插入功能无法解析