operator [] =重载?

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 []但是我不认为这会起作用,因为我必须编写查找程序??? (这个语法不仅仅用于返回数组项引用吗?)

我想在这里做什么甚至可能吗?任何建议表示赞赏 :)


似乎对我正在尝试做的事情感到困惑.我会发布我的代码:

http://pastebin.com/5Na1Xvaz


所有帮助后的成品:

http://pastebin.com/gx4gnYy8

ybu*_*ill 6

错误是因为hash是一个指针.改成:

StringHash hash;
Run Code Online (Sandbox Code Playgroud)


Pla*_*ure 6

其他答案与你的第一个问题有关。至于你的第二...

如果您返回引用,那么您将返回左值。您始终可以分配给左值。

是的,它(几乎)确实就是这么简单。不过,我建议您仔细阅读各个地方是否需要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)

请参阅此链接了解更多信息。


Cas*_*Cow 3

我首先会问为什么当有一些可用版本(尽管不是标准版本)时你要编写自己的 HashMap。(这是 2010 年写的,但现在有了 std::unordered_map)

您的哈希映射是否存储 const char* 指针或 std::string?(如果它只是一个存储在其他地方的数据的查找表,并且不会改变其生命周期,那么它可能会存储 const char * 指针)。

当找不到该项目时,operator[] 应该做什么?

现在让我假设答案是:

  • 是的,我们正在存储 const char * 指针,并且我们在空单元格中存储 NULL
  • 当我们执行 hash[key]=value 时,我们想要将键与值关联起来
  • 如果我们只做 hash[key] 但不写,它不会插入

这可以通过一个神奇的对象来完成:当您将 const char * 分配给该对象时,它会插入或覆盖散列。您还可以从对象隐式转换为 const char * 进行读取。

但这相当复杂,最好坚持使用映射的常规接口:operator[] 总是插入,并且您使用不同的方法来查找。