【问题标题】:C++ map insert with custom key fails使用自定义键插入 C++ 地图失败
【发布时间】:2011-12-08 16:00:10
【问题描述】:

我有一个自定义类作为地图中的键。当我尝试在地图中插入一个项目时,程序终止。密钥的创建肯定有问题。

class MyKey {
    char* data;
    bool operator<(const MyKey& s) const {
        for(int i = 0; i < (int)(sizeof(data)/sizeof(char)); i++) {
            if(data[i] > s.data[i])
            return false;
        }
        return true;
    }
}

map<MyKey, char>* map = new map<MyKey, char>;
MyKey* key = new MyKey(...);
map->insert(make_pair(*key, '0'));

程序在插入时终止。

【问题讨论】:

  • 能否贴出MyKey::operator&lt;()的实现和MyKey的定义(需要看成员变量和复制构造函数和赋值运算符)。
  • 我在密钥类中添加了一些信息
  • MyKey 中有复制构造函数吗?实现方式是什么?
  • 是否需要复制构造函数?
  • 在您的示例代码中,data 从不指向任何东西(并且可能未初始化)。请显示您对data 所做操作的完整代码。

标签: c++ map insert


【解决方案1】:

您无法像在 operator&lt; 函数的 for 循环中尝试做的那样仅从指针确定数组的大小...在某些时候您必须传入data 指向的数组的大小,这样您就不会溢出 data 指向的数组的边界。由于data 是一个指针,sizeof(data) 只返回您平台上指针的大小,而不是data 指向的数组的大小。

对于 C++,而不是使用分配的数组,您应该可能使用 STL 容器,您可以直接查询容器对象的大小...这可能包括 std::string(如果它是字符串数据)或 @987654328 @如果只是一堆二进制字节。

【讨论】:

    【解决方案2】:

    以下作品和印刷品 A.

        #include <iostream>
        #include <map>
        using namespace std;
    
        class Key
        {
        public:
             Key(int x):data(x) {}
             bool operator<(const Key &k) const { return(data < k.data); }
        private:
             int data;
        };
    
       int main()
       {
            Key myKey(10);
            map<Key, char> m;
            m.insert(make_pair(myKey, 'A'));
            map<Key, char>::iterator it = m.find(myKey);
            if (it != m.end())
            {
                cout << (*it).second << endl;
            }
       }
    

    【讨论】:

      【解决方案3】:

      在您的示例代码中,不会调用运算符

      class MyKey {
      public:
          MyKey()
          {
              data = new char[10];
          }
          ~MyKey()
          {
              delete data;
          }
      
      private:
          char* data;
      };
      

      【讨论】:

        猜你喜欢
        • 2016-10-28
        • 1970-01-01
        • 2014-12-08
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-08
        相关资源
        最近更新 更多