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; } }