我有以下代码,但我在最后一行收到错误:
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
答案 0 :(得分:40)
尝试制作operator <
const
:
bool operator<(const coord &o) const {
(您的= operator
可能应该是== operator
和const
答案 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);