c++ 为什么我可以使用一个类作为自定义比较标准,作为std::map的模板参数,而不提供类示例

bvk5enib  于 2023-03-20  发布在  其他
关注(0)|答案(2)|浏览(72)

我正在阅读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;
}

正如您所看到的,我使用自己的MyComparem展示了如何对元素进行排序。
我的问题是,由于MyCompare::operator()是一个普通的成员函数(我的意思是,它不是static或其他函数),我们需要一个MyCompare的示例来调用operator(),这意味着提供对象的地址。
但同样清楚的是,代码中没有这样的东西,代码运行良好。
有人能帮我回答吗?先谢谢你。

ffscu2ro

ffscu2ro1#

如果我们看一下cppreference的std::map constructors文档:

map( std::initializer_list<value_type> init,
    const Compare& comp = Compare(),
    const Allocator& alloc = Allocator() ); (10) (since C++11)

接受初始化列表的重载也为比较函数提供了默认值。在这种情况下,它将是MyCompare类的默认初始化示例。

t5fffqht

t5fffqht2#

map constructors中的比较函数对象是可选的。如果比较类型没有默认构造函数,您可能希望传递它。

相关问题