【问题标题】:C++ Operator overload: stl sort on vector of my custom classC++ 运算符重载:对我的自定义类的向量进行 stl 排序
【发布时间】:2012-05-05 17:25:06
【问题描述】:

我有一个非常基本的类,它存储在 STL Vector 中。我正在尝试对该向量进行排序,但遇到了神秘的 STL 错误。有人可以帮忙吗?

// Point.h
class Point {
public:
  Point() : x(0), y(0) {}
  Point( float x0, float y0 ) : x(x0), y(y0) {}
  float x;
  float y;
};

// Point.cpp, updated const as per given answers
bool operator< (const Point &p1,const  Point &p2)
{
    return p1.x < p2.x || (p1.x==p2.x && p1.y< p2.y);
}

同样,这个 Point 类存储在一个向量中并正在排序:

std::vector<Point> tmp=N->points;
std::sort(tmp.begin(),tmp.end());

错误:

http://ideone.com/WIv0u

有人能指出我正确的方向吗?谢谢!

【问题讨论】:

  • 尝试 const Point & 作为重载的参数。
  • 您似乎对如何使用ideone.com有误解。你把你的程序放在那里,它会为你编译和生成错误信息。无需自己粘贴错误消息。
  • @MarkRansom:据我所知,ideone 上不能有多个源文件和头文件。
  • @BenjaminLindley,您可能是对的,但您可以在您要执行 #include 的位置插入 .h 的内容。
  • @MarkRansom:他大概还必须插入他的 Point 实现文件的内容,在这种情况下,他不会有同样的错误。

标签: c++ sorting stl vector operator-overloading


【解决方案1】:

bool operator&lt; (constPoint &amp;p1,constPoint &amp;p2 )

【讨论】:

  • 刚试过这个,我还不得不将运算符实现移动到 .cpp 文件,因为 g++ 抱怨重复定义 - 仍然没有骰子。收到大量错误,我将在一秒钟内用错误的粘贴箱更新原始帖子。
  • @Joseph:将实现移至 cpp 文件后,标题中是否有声明(没有正文的签名)?在你使用std::sort的地方可见?
  • 对不起,你能澄清一下吗?在我使用 std::sort 的代码中,我包含了“Point.h”并且我正在编译 g++ main.cpp otherstuff.cpp Point.cpp。你问的是这个吗?
  • 比将其移动到另一个文件更好的方法可能是将inline添加到函数中:inline bool operator&lt;( const Point &amp;p1, const Point &amp;p2)
  • @Joseph:您说您将运算符实现移动到 .cpp 文件中。这很好。但是你仍然想在头文件中有这一行:bool operator&lt;(const Point &amp;,const Point &amp;);——你呢?
猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多