我正在阅读Nicolai M. Josuttis的 * C++标准库 * 的std::map
部分。
下面是一个简化的代码,可以显示这个问题困扰了我很多:
#include <iostream>
#include <map>
#include <string>
class MyCompare {
public:
bool operator() (const std::string& lhs, const std::string& rhs) const {
return lhs < rhs;
}
};
int main() {
std::map<std::string, int, MyCompare> m {{"foo", 1}, {"bar", 2}, {"baz", 3}};
for (const auto& p : m) {
std::cout << p.first << " -> " << p.second << std::endl;
}
return 0;
}
正如您所看到的,我使用自己的MyCompare
向m
展示了如何对元素进行排序。
我的问题是,由于MyCompare::operator()
是一个普通的成员函数(我的意思是,它不是static
或其他函数),我们需要一个MyCompare
的示例来调用operator()
,这意味着提供对象的地址。
但同样清楚的是,代码中没有这样的东西,代码运行良好。
有人能帮我回答吗?先谢谢你。
2条答案
按热度按时间ffscu2ro1#
如果我们看一下cppreference的std::map constructors文档:
接受初始化列表的重载也为比较函数提供了默认值。在这种情况下,它将是
MyCompare
类的默认初始化示例。t5fffqht2#
map constructors中的比较函数对象是可选的。如果比较类型没有默认构造函数,您可能希望传递它。