好吧,我正在尝试将一个快速的小类作为一种哈希表来工作。如果我可以让它工作,那么我应该能够这样做:
StringHash* hash = new StringHash;
hash["test"] = "This is a test";
printf(hash["test"]);
它应该打印出“这是一个测试”。
此时看起来我有2个问题。首先我这样做了:
const char* operator[](const char* key) {
for(int i = 0; i < hashSize; ++i) {
if(strcmp(hkeys[i], key) == 0) {return values[i];}
}
return NULL;
}
但是当我尝试查找值时,编译器会抱怨
错误:无效类型`StringHash * [const char [5]]'用于数组下标
其次,operator [] =似乎不是正确的语法。我能找到的唯一另一件事是&amp; operator []但是我不认为这会起作用,因为我必须编写查找程序??? (这种语法不仅仅用于返回数组项引用吗?)
我想在这里做什么甚至可能吗?任何建议表示赞赏:)
似乎对我正在尝试做的事情感到困惑。我会发布我的代码:
所有帮助后的成品:
答案 0 :(得分:6)
错误是因为hash
是一个指针。改为:
StringHash hash;
答案 1 :(得分:4)
其他答案与您的第一个问题有关。至于你的第二个......
如果您返回引用,那么您将返回左值。您始终可以分配左值。
是的,它(几乎)真的很简单。我建议您仔细阅读是否在不同的地方需要const
。
我记得读到的是,您应为const
提供const
和非operator[]
重载,如下所示:
MyType const &operator[](int index) const; // This is the array access version (no assignment allowed), which should work on const objects
MyType &operator[](int index); // This is the array access or assignment version, which is necessarily non-const.
有关详细信息,请参阅此链接。
答案 2 :(得分:3)
hash
不是StringHash
个对象。它指向一个。
你可以这样做:
(*hash)["test"] = "This is a test";
或者你可以问问自己为什么你需要一个指向它的指针,
StringHash hash;
hash["test" = "This is a test";
...或者即使你这样做,为什么你不会使用像auto_ptr
这样的智能指针。
#include <memory>
std::auto_ptr<StringHash> hash( new StringHash );
(*hash)["test"] = "This is a test";
答案 3 :(得分:2)
写StringHash hash;
而不是new
。 C ++不是Java。 : - )
答案 4 :(得分:2)
第一个错误是你声明哈希是一个指针。指针类型已经可以与索引运算符一起使用。例如,指针[3]相当于*(指针+ 3)。你无法改变这种行为。哈希对象本身:
StringHash sh;
至于operator [] =,没有这样的东西。您的索引运算符应该只返回一个引用,以使赋值工作。这是一个简单的例子:
class Indexable
{
std::string arr[3];
public:
std::string & operator[](int index) {
return arr[index];
}
std::string const& operator[](int index) const {
return arr[index];
}
};
答案 5 :(得分:2)
五个问题:
hash
是指向StringHash的指针,您必须取消引用它才能使用运算符:(*hash)["test"]
如果要分配给元素,则必须返回对元素类型
的引用 const char *& operator[] (const char* key);
// ...
(*hash)["test"] = "This is a test"; // will compile now
null
不是C ++中的关键字。使用0或NULL
。
operator []
必须为元素分配空间(如果找不到)。返回NULL
不是一种选择。否则,尝试分配(*hash)["test"]
的结果会导致程序崩溃。只是成为一个混蛋:你知道这不是哈希表,对吗?
答案 6 :(得分:2)
我首先会质疑为什么你在编写自己的HashMap时有一些版本可用,虽然不是标准版本。
你的hash-map是否存储const char * pointers或std :: strings? (它可能存储const char *指针,如果它只是存储在别处的数据的查找表,不会改变其生命周期)。
当找不到该项目时,operator []应该做什么?
现在让我假设答案是: - 是的,我们存储const char *指针,我们在空单元格中存储NULL - 当我们执行hash [key] = value时,我们想要将key与value相关联 - 如果我们只是执行hash [key]但不写,则不会插入
这可以使用魔术对象完成:当您为此对象分配const char *时,它会插入或覆盖该哈希。您还可以从对象隐式转换为const char *以进行读取。
虽然这很复杂,但最好坚持使用map的常规接口:operator []总是插入,而你只是使用不同的方法进行查找。
答案 7 :(得分:1)
您是否可以使用boost::unordered_map<std::string, std::string
?那么你不必担心自己实现这个。
假设这是对你自己的某种锻炼: 您可能来自不同的背景,但在C ++中,声明哈希的常规方法是:
StringHash hash;
此外,您的operator[]
可能适用于打印,但它不适用于作业。通常,operator[]
方法通过返回可以为其分配新值的非const引用或代理对象来工作,而您的方法也不会。如果你能够使用std :: string,你可以重写你的方法,将非const引用返回到应该读取或分配的哈希中的位置。