带有自定义键的C ++映射插入失败

时间:2011-12-08 16:00:11

标签: c++ map insert

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

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'));

程序在插入处终止。

3 个答案:

答案 0 :(得分:4)

您无法单独从指针确定数组的大小,就像您在operator<函数的for循环中尝试执行的那样......在某些时候,您将不得不传递data指向的数组的大小,这样就不会溢出数组data所指向的边界。由于data是指针,sizeof(data)只返回平台上指针的大小,而不是data指向的数组的大小。

对于C ++,您应该可以使用可以直接查询容器对象大小的STL容器,而不是使用已分配的数组...如果是字符串数据,则可以包括std::string,或者std::vector<unsigned char>如果它只是一堆二进制字节。

答案 1 :(得分:0)

从您的示例代码中,运算符&lt;不会被调用,因为您只在地图中插入一个元素。而且你说你没有实现拷贝构造函数。因此,遵循以下代码将是一个问题:

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

private:
    char* data;
};

答案 2 :(得分:0)

以下作品并打印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;
        }
   }