如何在std :: map中使用struct作为键?

时间:2011-08-26 11:56:16

标签: c++ c++11 stdmap

我有以下代码,但我在最后一行收到错误:

struct coord { 
    int x, y; 

    bool operator=(const coord &o) {
        return x == o.x && y == o.y;
    }

    bool operator<(const coord &o) {
        return x < o.x || (x == o.x && y < o.y);
    }
};

map<coord, int> m;
pair<coord, int> p((coord{0,0}),123);
m.insert(p); // ERROR here

如何在地图中使用结构作为键?


我尝试将代码更改为:

struct coord { 
    int x, y; 

    bool const operator==(const coord &o) {
        return x == o.x && y == o.y;
    }

    bool const operator<(const coord &o) {
        return x < o.x || (x == o.x && y < o.y);
    }
};

但我仍然收到以下错误:

  

C:\ Users \ tomc \ Desktop \ g&gt; mingw32-make g ++ test.cpp -std = c ++ 0x in file   包括在内   c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.5.2 / include / c ++ / string:5 0:0,                    从   C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.5.2 /包括/ C ++ /比特/ LOC   ale_classes.h:42,                    从   C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.5.2 /包括/ C ++ /比特/ IOS   _base.h:43,                    从   C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.5.2 /包括/ C ++ / IOS:43,                    从   c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.5.2 / include / c ++ / ostream:40,                    从   c:\ mingw \ bin ../ lib / gcc / mingw32 / 4.5.2 / include / c ++ / iostream:40,                    来自test.cpp:1:   C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.5.2 /包括/ C ++ /比特/ stl_function.h:   在成员函数'bool std :: less&lt; _Tp&gt; :: operator()(const _Tp&amp;,const)中   _Tp&amp;)const [with _ Tp = coord]':   C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.5.2 /包括/ C ++ /比特/ stl_tree.h:1184:4:   inst反对'std :: pair,bool&gt;   std :: _ Rb_tree&lt; _Key,_Val,_KeyOfValue,_Compare,   _Alloc&gt; :: _ M_insert_unique(const _Val&amp;)[with _Key   = coord,_Val = std :: pair,_KeyOfValue =   std :: _ Select1st&gt;,_ Compare =   std :: less,_Alloc = std :: allocator&gt;]'   C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.5.2 /包括/ C ++ /比特/ stl_map.h:501:41:   安装自'std :: pair,std :: _ Select1st&gt;,_比较,typename _Alloc :: rebind :: value_type&gt; ::其他&gt; :: iterator,bool&gt; STD   :: map&lt; _Key,_Tp,_Compare,_ Alloc&gt; :: insert(const std :: map&lt; _Key,_Tp,   _Compare,_ Alloc&gt; :: value_type&amp;)[with _Key = coord,_Tp = int,   _Compare = std :: less,_Alloc = std :: allocator&gt;,typename std :: _ Rb_tree&lt; _ Key,std :: pair,std :: _ Select1st&gt;,_ Compare,   typename _Alloc :: rebind :: value_ty pe&gt; :: other&gt; :: iterator =   std :: _ Rb_tree_iterator&gt ;, st d :: map&lt; _Key,   _Tp,_Compare,_Alloc&gt; :: value_type = std :: pair]'   test.cpp:56:12:从这里实例化   C:\ MinGW的\ BIN ../ LIB / GCC /的mingw32 / 4.5.2 /包括/ C ++ /比特/ stl_function.h:230:22:   er ror:将'const coord'作为'const bool'的'this'参数传递   coord :: operator&lt;(co nst coord&amp;)'丢弃限定词mingw32-make:***   [游戏]错误1

4 个答案:

答案 0 :(得分:40)

尝试制作operator < const

bool operator<(const coord &o)  const {

(您的= operator可能应该是== operatorconst

答案 1 :(得分:8)

到目前为止,最简单的方法是为结构定义一个全局“小于”运算符,而不是作为成员函数。

std :: map使用 - 默认情况下 - 'lessthan'仿函数,反过来,它使用全局“运算符&lt;”为地图的密钥类型定义。

bool operator<(const coord& l, const coord& r) {
     return (l.x<r.x || (l.x==r.x && l.y<r.y));
}

答案 2 :(得分:1)

另一种可用于第三方数据类型的解决方案是传递Comparison object作为第三个模板参数。 example

答案 3 :(得分:0)

Andrii answer中所述,您可以向map提供自定义比较对象,而不是为结构定义operator<。从C++11开始,您还可以使用lambda expression代替定义比较对象。此外,您无需为结构定义operator==即可使map工作。因此,您可以将结构保持如下简短:

struct coord {
    int x, y;
};

其余代码可以编写如下:

auto comp = [](const coord& c1, const coord& c2){
    return c1.x < c2.x || (c1.x == c2.x && c1.y < c2.y);
};
std::map<coord, int, decltype(comp)> m(comp);

Code on Ideone