【问题标题】:STL map with custom class comparator not working带有自定义类比较器的 STL 映射不起作用
【发布时间】:2015-06-21 14:02:56
【问题描述】:

我有一个以类为键的地图。

在这个类中,我重载了< 运算符,我在这里读到地图会自动使用它进行比较和排序。

编译时出现如下错误:

错误 1 ​​错误 C2664: 'std::pair::pair(const std::pair &)' : 无法将参数 1 从 'Position' 到 'Position *const &' e:\program files\visual studio 2013 终极\vc\include\xmemory0

我不明白这真正意味着什么,也不知道如何避免它。它也没有突出显示我的代码中的任何内容。

这是我的代码,我的类是坐标,我希望它们从左到右,从上到下排序,但这里的逻辑不是问题。

Position 文件中显然还有更多内容,但我认为这些是相关部分。

main.cpp

int main()
{
  std::map<Position*, int> karte;
  Position p1;
  p1.setX(0);
  p1.setY(0);

  Position p2;
  p2.setX(0);
  p2.setY(1);

  Position p3;
  p3.setX(1);
  p3.setY(0);

  Position p4;
  p4.setX(1);
  p4.setY(1);

  karte.emplace(p1, 1);
  karte.emplace(p2, 2);
  karte.emplace(p3, 3);
  karte.emplace(p4, 4);

  for (auto& x : karte)
  {
    std::cout << x.first->toString() << ": " << x.second << std::endl;
  }
  return 0;
}

位置.h

bool operator<(const Position&) const;

位置.cpp

bool Position::operator<(const Position &position) const
{
  if ((x_ < position.x_) && (y_ == position.y_))
  {
    return true;
  }
  if (x_ > position.x_ && y_ < position.y_)
  {
    return true;
  }
  if (x_ == position.x_ && y_ < position.y_)
  {
    return true;
  }
  else
  {
    return false;
  }
}

【问题讨论】:

  • 地图的键是指针。您的比较器不比较指针。
  • 您正在尝试将Position 存储在声明为存储Position* 的容器中
  • 事实上,在这种情况下甚至没有调用自定义比较器。
  • 如何更改要调用的比较器?地图中必须有Position*,否则很多其他代码都不起作用。
  • @MikeSeymour 你不能为指针重新定义运算符

标签: c++ class c++11 dictionary


【解决方案1】:

如果您需要地图的键是指针,您可以创建自己的比较器并将其传递给地图:

struct PositionPointerLesser
{
  bool operator() (Position *lhs, Position *rhs) const
  {
    return *lhs < *rhs;  // This calls the operator < in your class
  }
};

int main()
{
  std::map<Position*, int, PositionPointerLesser> karte;
  // ...
}

【讨论】:

  • std::binary_function 已弃用,无需继承。
  • @AntonSavin 好点,已删除。这是我从处理 pre-11 编译器中学到的一个习惯,它有时需要它带来的 typedef 提供的额外信息。
【解决方案2】:

将您的地图重新定义为:

std::map<Position, int> karte;

编译错误是因为您试图将pair&lt;Position, int&gt; 插入到地图中:

Position p1;
<snip>
karte.emplace(p1, 1);

并且您已将您的地图声明为map&lt;Position*, int&gt;

【讨论】:

  • 也谢谢你,不幸的是很多代码依赖于以Position为指针的地图,不是我写的。
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 2018-09-07
相关资源
最近更新 更多