如何在c ++集中插入值

时间:2011-10-09 18:52:54

标签: c++ stl set

我正在尝试创建Point类

的一组自定义对象

point.h

#ifndef POINT_H
#define POINT_H

class Point
{
      float x_coordinate,y_coordinate;
      public:
             Point(float x, float y):x_coordinate(x),y_coordinate(y)
             {}

             float get_x()
             {
                   return x_coordinate;
             }

             float get_y()
             {
                   return y_coordinate;
             }

             bool operator==(Point rhs)
             {
                  if( ((int)x_coordinate == (int)rhs.get_x()) && ((int)y_coordinate == (int)rhs.get_y()) )
                      return true;
                  else return false;
             }

             bool operator<(Point rhs)
             {
                  if((int)x_coordinate < (int)rhs.get_x())
                      return true;
                  else return false;
             }
};

#endif

我刚刚开始编写驱动程序

#include<iostream>
#include<set>
#include "point.h"
using namespace std;



int main()
{
    Point p1(-10,-10),p2(-10,10),p3(10,10),p4(10,-10);
    set<Point> points_set = set<Point>();
    points_set.insert(p1);

    return 0;
}

但是我在编译期间遇到了这个错误,我已经重载了比较和相等运算符,我还需要做些什么才能让它工作?

In file included from /usr/include/c++/4.6/string:50:0,
                 from /usr/include/c++/4.6/bits/locale_classes.h:42,
                 from /usr/include/c++/4.6/bits/ios_base.h:43,
                 from /usr/include/c++/4.6/ios:43,
                 from /usr/include/c++/4.6/ostream:40,
                 from /usr/include/c++/4.6/iostream:40,
                 from driver.cpp:1:
/usr/include/c++/4.6/bits/stl_function.h: In member function ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Point]’:
/usr/include/c++/4.6/bits/stl_tree.h:1267:4:   instantiated from ‘std::pair<std::_Rb_tree_iterator<_Val>, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = Point, _Val = Point, _KeyOfValue = std::_Identity<Point>, _Compare = std::less<Point>, _Alloc = std::allocator<Point>]’
/usr/include/c++/4.6/bits/stl_set.h:410:29:   instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const value_type&) [with _Key = Point, _Compare = std::less<Point>, _Alloc = std::allocator<Point>, typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator = std::_Rb_tree_const_iterator<Point>, std::set<_Key, _Compare, _Alloc>::value_type = Point]’
driver.cpp:12:25:   instantiated from here
/usr/include/c++/4.6/bits/stl_function.h:236:22: error: passing ‘const Point’ as ‘this’ argument of ‘bool Point::operator<(Point)’ discards qualifiers [-fpermissive]

6 个答案:

答案 0 :(得分:6)

float get_x() const { ... }
float get_y() const { ... }
bool operator==(Point const& rhs) const { ... }
bool operator<(Point const& rhs) const { ... }

您在参数和方法本身中缺少所有const个。

注意:我不确定将operator<用于set中的项目的要求是什么,但您提供的项目非常弱。

答案 1 :(得分:2)

你需要声明operator ==和operator&lt;作为const成员函数。这将允许在const对象上调用它们,就像存储在集合中的所有对象一样:

bool operator<(Point rhs) const

其他人已经指出,您的代码示例还存在其他问题:

  • get_x和get_y也应该是const方法
  • 运营商的实施&lt;在比较中过于宽松。 std :: set在执行插入和查找时使用“等价”的概念。事实上,几个不同的对象可能无法与运营商一致地进行比较。 (即它不是“弱排序函数”)肯定会与其他std :: set操作混在一起。特别是,在您的代码示例中,该集合无法区分(-10,-10)和(-10,10)。您应该至少比较x和y坐标的点,并使用浮点比较而不是整数比较

答案 2 :(得分:2)

@Mat beat me to it回答您的具体问题。所以我只是指出你的非惯用C ++的一些问题。您不需要条件来返回布尔值。只需返回if语句的值:

bool operator==(const Point& rhs) const
{
    return ((int)x_coordinate == (int)rhs.get_x()) && ((int)y_coordinate == (int)rhs.get_y());
}

bool operator<(const Point& rhs) const
{
    return (int)x_coordinate < (int)rhs.get_x();
}

此外,最好在C ++中陈述显式强制转换机制,而不是使用C风格的案例:

    return static_cast<int>(x_coordinate) < static_cast<int>(rhs.get_x());

答案 3 :(得分:1)

正确的签名是:

bool operator<(const Point & rhs) const

此外,您需要声明const函数get_xget_y

operator=具有相似的签名,但在这种情况下并非强制性。

答案 4 :(得分:1)

其他人已经解决了const问题。我想补充一点,当你声明points_set时,你可以简单地说:

set<Point> points_set;

而不是你现在拥有的:

set<Point> points_set = set<Point>();

答案 5 :(得分:0)

你需要将Point传递给const&amp;两个运营商。运算符本身也应该是const。

我还注意到运营商&lt;不是比较y坐标,是故意吗?考虑(0/7)&lt; (0/5)将为假并且(0/5)<0。 (0/7)也将是假的。