【问题标题】:How to create a map with key and value as structs in C++?如何在 C++ 中创建一个键和值作为结构的映射?
【发布时间】:2012-05-11 22:22:26
【问题描述】:

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

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

【问题讨论】:

标签: c++ map struct


【解决方案1】:

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

bool stE::operator< (const stE &);

【讨论】:

  • 您要么需要它,要么必须声明一个比较器类并将其作为第三个模板参数提供给 map&lt;...&gt; 的定义中的 struct stE
【解决方案2】:

您需要提供strict weak ordering comparison,您可以通过为您的stE 定义operator&lt; 或将仿函数的比较器函数作为映射模板参数传递来实现。 std::map 看起来像这样:

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

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

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

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

struct stE{
  int num;
  char* form; 
  char* et; 
  map<stE,stR> s; // how do we use this in the comparison?
}; 

【讨论】:

  • std::map 不要求其 value_type 是默认可构造的(通常)。 map&lt;stE,stR&gt; s; 成员更成问题,因为此时 stE 不完整,这是非法的(尽管并非所有实现都拒绝它)。
  • @ymett 如果为地图中不存在的键调用地图的 operator[],则默认构造该值。至于不完整的类型,我必须检查标准。 GCC 似乎毫无怨言地吞下了它:-)
  • 所以如果你想使用 operator[] value_type 必须是默认可构造的,否则不是。许多实现实际上会接受不完整的类型,但标准说它是未定义的。
猜你喜欢
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2020-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多