我正在尝试创建一个地图,其键和值都是结构(stE和stR),所以我有这样的东西:
struct stR{
char* est;
char* et;
};
struct stE{
int num;
char* form;
char* et;
map<stE,stR> s;
};
但是当我想插入一个新元素时:
stE e;
e.num=1;
e.form="a";
e.et="b";
stE f;
f.num=2;
f.form="c";
f.et="d";
stR r;
r.est="e";
r.et="";
e.s.insert(make_pair(f, r));
它给了我一个错误:
C:\ Dev-Cpp \ include \ c ++ \ 3.4.2 \ bits \ stl_function.h在成员函数`bool std :: less&lt; _Tp&gt; :: operator()(const _Tp&amp;,const _Tp&amp;)const中[with _Tp = stEstado]':
我找不到问题所在。谁能帮助我? 提前谢谢。
答案 0 :(得分:3)
使用地图时,您需要提供一个小于运算符或者给它一个比较器,因为它会自动对键进行排序。
bool stE::operator< (const stE &);
答案 1 :(得分:3)
您需要提供strict weak ordering comparison,您可以通过为operator<
定义stE
或将仿函数的比较器函数作为地图模板参数传递来实现。 std::map
看起来像这样:
template<class Key, class T, class Compare = std::less<Key>, ... > class map;
默认情况下,Compare
设置为使用T::operator<(const T&)
,但您可以传递自己的实现逻辑的仿函数类型。如果您无法修改实际的类,这很重要。
请记住,map需要能够插入默认构造的stR
对象,并且您当前的结构没有默认构造函数,指针将被初始化为随机值。这可能是一个进一步的问题。
此外,您的键结构有一个映射,它是它自己的键类型。当您尝试实现小于比较时,这可能会导致递归问题:
struct stE{
int num;
char* form;
char* et;
map<stE,stR> s; // how do we use this in the comparison?
};