Kha*_*hat 6 c++ brackets operator-overloading
好吧,我正在尝试将一个快速的小类作为一种哈希表来工作.如果我可以让它工作,那么我应该能够这样做:
StringHash* hash = new StringHash;
hash["test"] = "This is a test";
printf(hash["test"]);
Run Code Online (Sandbox Code Playgroud)
它应该打印出"这是一个测试".
看起来我现在有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;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试查找值时,编译器会抱怨这一点
错误:数组下标的类型`StringHash*[const char [5]]'无效
其次operator [] =在这里似乎不是正确的语法.我能找到的唯一另一件事是&operator []但是我不认为这会起作用,因为我必须编写查找程序??? (这个语法不仅仅用于返回数组项引用吗?)
我想在这里做什么甚至可能吗?任何建议表示赞赏 :)
似乎对我正在尝试做的事情感到困惑.我会发布我的代码:
所有帮助后的成品:
其他答案与你的第一个问题有关。至于你的第二...
如果您返回引用,那么您将返回左值。您始终可以分配给左值。
是的,它(几乎)确实就是这么简单。不过,我建议您仔细阅读各个地方是否需要const。
我记得读过的是,您应该为 提供 aconst和非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.
Run Code Online (Sandbox Code Playgroud)
请参阅此链接了解更多信息。
我首先会问为什么当有一些可用版本(尽管不是标准版本)时你要编写自己的 HashMap。(这是 2010 年写的,但现在有了 std::unordered_map)
您的哈希映射是否存储 const char* 指针或 std::string?(如果它只是一个存储在其他地方的数据的查找表,并且不会改变其生命周期,那么它可能会存储 const char * 指针)。
当找不到该项目时,operator[] 应该做什么?
现在让我假设答案是:
这可以通过一个神奇的对象来完成:当您将 const char * 分配给该对象时,它会插入或覆盖散列。您还可以从对象隐式转换为 const char * 进行读取。
但这相当复杂,最好坚持使用映射的常规接口:operator[] 总是插入,并且您使用不同的方法来查找。