为何可将类作为std::map模板参数而非实例用作自定义比较准则
为什么std::map使用自定义比较器类时无需显式提供实例?
核心原因很简单:std::map会自动默认构造一个你指定的比较器类的实例,用来完成内部的排序逻辑。
具体来说:
- 你给std::map指定的第三个模板参数
MyCompare是比较器的类型,而不是具体的实例。map需要一个可调用对象来做元素比较,所以它会在自身构造过程中自动创建这个类型的实例。 - 你的
MyCompare类没有定义任何构造函数,编译器会自动为它生成一个无参的默认构造函数,这让map可以顺利构造出比较器实例;之后每次需要比较元素时,就用这个实例去调用operator()。
可以做个测试验证:给MyCompare添加一个带参数的构造函数(此时编译器不会再生成默认构造函数),你的代码会直接编译失败——因为map无法默认构造出比较器实例了:
class MyCompare { public: MyCompare(int dummy) {} // 自定义构造函数,覆盖默认构造 bool operator() (const std::string& lhs, const std::string& rhs) const { return lhs < rhs; } }; // 编译报错:无法默认构造MyCompare类型的对象 std::map<std::string, int, MyCompare> m {{"foo", 1}, {"bar", 2}, {"baz", 3}};
当然,如果你想自己控制比较器实例,也可以显式传入:
MyCompare my_comp; // 手动创建比较器实例 // 将实例传入map的构造函数 std::map<std::string, int, MyCompare> m(my_comp, {{"foo", 1}, {"bar", 2}, {"baz", 3}});
内容的提问来源于stack exchange,提问作者LiuYuan
相关产品推荐
相关产品推荐

