0

我正在尝试创建一个映射,其键和值都是结构(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<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = stEstado ]':

我找不到问题所在。有人可以帮我吗?提前致谢。

4

2 回答 2

3

使用地图时,您需要提供小于运算符或给它一个比较器,因为它会自动对键进行排序。

bool stE::operator< (const stE &);
于 2012-05-02T12:35:27.960 回答
3

您需要提供严格的弱排序比较,您可以通过operator<为您定义stE或将仿函数的比较器函数作为映射模板参数传递来实现。std::map看起来像这样:

template<class Key, class T, class Compare = std::less<Key>, ... > class map;

默认情况下,Compare设置为 use T::operator<(const T&),但您可以传递您自己的实现逻辑的函子类型。如果您无法修改实际类,这一点很重要。

请记住,映射需要能够插入默认构造stR对象,并且您当前的结构没有默认构造函数,指向的指针将被初始化为随机值。这可能是一个更进一步的问题。

此外,您的键结构有一个映射,它是它自己的键类型。当您尝试实现小于比较时,这可能会导致递归问题:

struct stE{
  int num;
  char* form; 
  char* et; 
  map<stE,stR> s; // how do we use this in the comparison?
}; 
于 2012-05-02T12:37:58.407 回答