簡體   English   中英

operator [] =重載?

[英]operator[]= overload?

好吧,我正在嘗試將一個快速的小類作為一種哈希表來工作。 如果我可以讓它工作,那么我應該能夠這樣做:

  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 [] =在這里似乎不是正確的語法。 我能找到的唯一另一件事是&operator []但是我不認為這會起作用,因為我必須編寫查找程序??? (這個語法不僅僅用於返回數組項引用嗎?)

我想在這里做什么甚至可能嗎? 任何建議表示贊賞 :)


似乎對我正在嘗試做的事情感到困惑。 我會發布我的代碼:

http://pastebin.com/5Na1Xvaz


所有幫助后的成品:

http://pastebin.com/gx4gnYy8

錯誤是因為hash是一個指針。 改成:

StringHash hash;

其他答案與您的第一個問題有關。 至於你的第二個......

如果你返回一個引用,那么你將返回一個左值。 您始終可以分配左值。

是的,它(幾乎)真的很簡單。 不過,我建議您仔細閱讀是否需要const

我記得讀過的是你應該為operator[]提供一個const和一個非const重載,如下所示:

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.

有關更多信息,請參閱此鏈接。

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";

StringHash hash; 而不是new東西。 C ++不是Java。 :-)

第一個錯誤是您聲明哈希是一個指針。 指針類型已經可以與索引運算符一起使用。 例如,指針[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];
   }
};

五個問題:

  1. hash是指向StringHash的指針,你必須取消引用它才能使用運算符: (*hash)["test"]
  2. 如果要分配給元素,則必須返回對元素類型的引用

    const char *& operator[] (const char* key);

    // ...

    (*hash)["test"] = "This is a test"; // will compile now

  3. null不是C ++中的關鍵字。 使用0或NULL

  4. 如果找不到元素, operator []必須為元素分配空間。 返回NULL不是一個選項。 否則,嘗試分配(*hash)["test"]將導致程序崩潰。
  5. 使用std :: map或std :: tr1 :: unordered_map而不是編寫自己的“快速”類。

而且只是成為一個混蛋:你知道這不是哈希表,對嗎?

我會首先質疑為什么在編寫自己的HashMap時有一些版本可用,盡管不是標准版本。

你的hash-map是否存儲const char * pointers或std :: strings? (它可能存儲const char *指針,如果它只是一個查找表,存儲在別處的數據,不會改變它的生命周期)。

當找不到項目時,operator []應該做什么?

現在讓我假設答案是: - 是的,我們存儲const char *指針,並且我們在空單元格中存儲NULL - 當我們執行hash [key] = value時,我們想要將鍵與值相關聯 - 如果我們只是這樣做hash [key]但不寫,它不插入

這可以使用魔術對象完成:當您為此對象分配const char *時,它會插入或覆蓋散列。 您還可以從對象隱式轉換為const char *以進行讀取。

這是非常復雜的,並且最好堅持map的常規接口:operator []總是插入並且您使用不同的方法來查找。

你能使用boost::unordered_map<std::string, std::string嗎? 那么你不必擔心自己實現這個。

假設它是你自己的某種練習:你可能來自不同的背景,但在C ++中,聲明你的哈希的正常方法是:

StringHash hash;

此外,您的operator[]可能適用於打印,但它不適用於分配。 通常, operator[]方法通過返回非const引用或可以為其分配新值的代理對象來工作,而您的方法也不會。 如果您能夠使用std :: string,則可以重寫您的方法以返回非const引用,以指向應該讀取或分配的哈希中的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM