std ::将用户定义的types映射为键

我想知道为什么我不能使用用户定义类的STL地图。 当我编译下面的代码,我得到这个神秘的错误消息。 这是什么意思? 另外,为什么只发生在用户定义的types? (原始types用于密钥时是可以的)

C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.5 …….. \ include \ c ++ \ 3.4.5 \ bits \ stl_function.h ||在成员函数`bool std :: less <_Tp> :: operator()(const _Tp&,const _Tp&)const [with _Tp = Class1]':

C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.5 …….. \ include \ c ++ \ 3.4.5 \ bits \ stl_map.h | 338 |从_Tp&std :: map <_Key,_Tp,_Compare,_Alloc> :: operator [](const _Key&)[_Key = Class1,_Tp = int,_Compare = std :: less,_Alloc = std :: allocator>]

C:\ Users \ Admin \ Documents \ dev \ sandbox \ sandbox \ sandbox.cpp | 24 |从这里实例化|

C:\ MinGW \ bin .. \ lib \ gcc \ mingw32 \ 3.4.5 …….. \ include \ c ++ \ 3.4.5 \ bits \ stl_function.h | 227 |错误:'operator' <'in __x <__y'| || ===构build完成:1个错误,0个警告=== |

#include <iostream> #include <map> using namespace std; class Class1 { public: Class1(int id); private: int id; }; Class1::Class1(int id): id(id) {} int main() { Class1 c1(1); map< Class1 , int> c2int; c2int[c1] = 12; return 0; } 

实际上,您不必为您的class级定义operator< 。 你也可以为它创build一个比较函数对象类,并使用它来专门化std::map 。 扩展你的例子:

 struct Class1Compare { bool operator() (const Class1& lhs, const Class1& rhs) const { return lhs.id < rhs.id; } }; std::map<Class1, int, Class1Compare> c2int; 

恰巧, std::map的第三个模板参数的默认值是std::less ,它将委托给为你的类定义的operator< (如果没有,则失败)。 但是有时你希望对象可以作为映射键使用,但实际上并没有任何有意义的比较语义,所以你不想通过为你的类提供operator<来混淆人们。 如果是这样的话,你可以使用上面的技巧。

实现这个目标的另一种方法是专门化std::less

 namespace std { template<> struct less<Class1> { bool operator() (const Class1& lhs, const Class1& rhs) const { return lhs.id < rhs.id; } }; } 

这样做的好处是它将被std::map “默认”选中,但是不会将operator<公开给客户代码。

默认情况下, std::map (和std::set )使用operator<来确定sorting。 因此,你需要在你的类上定义operator<

if !(a < b) && !(b < a)则认为两个对象相等。

如果出于某种原因想要使用不同的比较器,则可以将map的第三个模板参数更改为std::greater

您需要为Class1定义operator <

Map需要使用operator <来比较这些值,因此当用户定义的类用作关键字时,您需要提供相同的值。

 class Class1 { public: Class1(int id); bool operator <(const Class1& rhs) const { return id < rhs.id; } private: int id; }; 

键必须具有可比性,但是您尚未为您的自定义类定义合适的operator<

 class key { int m_value; public: bool operator<(const key& src)const { return (this->m_value < src.m_value); } }; int main() { key key1; key key2; map<key,int> mymap; mymap.insert(pair<key,int>(key1,100)); mymap.insert(pair<key,int>(key2,200)); map<key,int>::iterator iter=mymap.begin(); for(;iter!=mymap.end();++iter) { cout<<iter->second<<endl; } }