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
    那么它的值可能会被改变,所以编译会出错。

  • 相关阅读:
    Multisim的电路分析方法
    转载论文关于fir滤波器的fpga实现
    verilog数组定义及其初始化
    FIR滤波器的FPGA实现方法
    matlab的fda工具使用方法
    卷积的幽默解释
    lvds配置
    latch的产生和消除
    时序优化实例
    第九篇:使用 lstat 函数获取文件信息
  • 原文地址:https://www.cnblogs.com/xujie-nm/p/4513859.html
Copyright © 2011-2022 走看看