最近我被问到如何将自定义类型作为stl :: map的可能键的问题。
直接向前我回答他们重载“<”运算符函数以支持自定义类型。这是“custom type链接”链接
当他们问我哪个方面可以解决这个问题。我只是暗示我们也可以通过重载“==”运算符来实现。但他对答案不满意。
请帮助我知道,如果有任何其他方法可以解决此问题“将自定义类型设为地图的可能键”。
答案 0 :(得分:4)
std::map
需要小于(或等效; less<key_type>
是默认值,每个表102),比较键类型。
[C++11: 23.2.4/3]:
短语“等价键”表示比较所强加的等价关系,不operator==
键。也就是说,如果对于比较对象k1
,则认为两个键k2
和comp, comp(k1, k2) == false && comp(k2, k1) == false
是等效的。对于同一容器中的任意两个键k1
和k2
,调用comp(k1, k2)
应始终返回相同的值。
因此,您可以提供非less<key_type>
的比较器函数,以避免调用operator<
,但上面定义的最终结果必须相同。 operator==
完全无关紧要。
#include <iostream>
#include <map>
/**
* A comparator that defines strict-weak ordering,
* but is backwards!
*/
struct Comp
{
bool operator()(const int& lhs, const int& rhs)
{ return rhs < lhs; }
};
int main()
{
{
std::map<int, char> m; // uses default less<int> comparator
m[0] = 'a';
m[1] = 'b';
m[2] = 'c';
for (auto el : m)
std::cout << el.second; // "abc"
}
{
std::map<int, char, Comp> m; // uses my own comparator defined above
m[0] = 'a';
m[1] = 'b';
m[2] = 'c';
for (auto el : m)
std::cout << el.second; // "cba" ... which is true ;)
}
}
答案 1 :(得分:1)
此处std::maps with user-defined types as key 你有办法专门为你的自定义类使用比较器函数std :: map。
可能面试官不高兴因为==无法提供日志(N)时间方法来访问 地图的价值。实际上,如果只是你必须检查整套键是否相等 提供平等。地图不能仅用于相等。