zoukankan      html  css  js  c++  java
  • 关于set或map的key使用自定义类型的问题

    我们都知道set或map的key使用自定义类型时必须重载<关系运算符
    但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const
    而对象调用的方法也必须是const的

    1 #include
    2 #include
    4 #include
    7 using namespace std;
    8
    9 class Point{
    10 public:
    11 Point(int X, int Y):x(X), y(Y){};
    12 int get_x()const{
    13 return x;
    14 }
    15 int get_y()const{
    16 return y;
    17 }
    18 private:
    19 int x;
    20 int y;
    21 };
    22
    23 inline bool operator<(const Point &p1, const Point &p2){
    24 return p1.get_x() < p2.get_x();
    25 }
    26
    27 int main(int argc, const char *argv[])
    28 {
    29 map<Point, int> test;
    30 Point p1(1, 2);
    31 test[p1] = 5;
    32 return 0;
    33 }
    这样的是正确的,没有问题

    1 #include
    5 #include
    7 using namespace std;
    8
    9 class Point{
    10 public:
    11 Point(int X, int Y):x(X), y(Y){};
    12 int get_x(){
    13 return x;
    14 }
    15 int get_y(){
    16 return y;
    17 }
    18 inline bool operator<(Point &p1,Point &p2){
    19 return p1.get_x() < p2.get_x();
    20 }
    21 private:
    22 int x;
    23 int y;
    24 };
    25
    26
    27 int main(int argc, const char *argv[])
    28 {
    29 map<Point, int> test;
    30 Point p2(1,2);
    31 test[p2] = 5;
    32 return 0;
    33 }
    而这样的,在编译时会出现很多相关的编译错误
    出现这样的原因是,在map或set使用时,它们会自动的调用小于操作符来建立底层的红黑树
    但是这里有一个条件就是在调用的过程中,key是不允许改变的,但是如果你声明为non-const
    那么它的值可能会被改变,所以编译会出错。

  • 相关阅读:
    Study Plan The TwentySecond Day
    Study Plan The Nineteenth Day
    Study Plan The TwentySeventh Day
    Study Plan The Twentieth Day
    Study Plan The TwentyFirst Day
    python实现进程的三种方式及其区别
    yum makecache
    JSONPath 表达式的使用
    oracle执行cmd的实现方法
    php daodb插入、更新与删除数据
  • 原文地址:https://www.cnblogs.com/xujie-nm/p/4513859.html
Copyright © 2011-2022 走看看