[英]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 []但是我不認為這會起作用,因為我必須編寫查找程序??? (這個語法不僅僅用於返回數組項引用嗎?)
我想在這里做什么甚至可能嗎? 任何建議表示贊賞 :)
似乎對我正在嘗試做的事情感到困惑。 我會發布我的代碼:
所有幫助后的成品:
錯誤是因為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];
}
};
五個問題:
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"]
將導致程序崩潰。 而且只是成為一個混蛋:你知道這不是哈希表,對嗎?
我會首先質疑為什么在編寫自己的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.