我将自定义类作为地图中的键。当我尝试将项目插入地图时,程序终止。创建密钥时必须存在问题。
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'));
程序在插入处终止。
答案 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;
}
}