如何在C ++中创建具有键和值的映射作为结构?

时间:2012-05-02 12:32:54

标签: c++ map struct

我正在尝试创建一个地图,其键和值都是结构(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]':

我找不到问题所在。谁能帮助我? 提前谢谢。

2 个答案:

答案 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?
};