2015-08-30 100 views
0

我想實現插入一個單詞到一個鏈式散列表。
問題是我想插入一個有2個文件的對象,我需要訪問一個迭代器。這個問題似乎在迭代器it中發生,因爲該代碼不適用於for循環。我還在Vocabolo.cpp中重載了operator==以使其適用於我的情況。向量列表+迭代器CPP

我也有一個問題的矢量的大小,我可以使用一個定義?看起來不是。有什麼建議嗎?

我宣佈我的名單+迭代器的矢量頭文件爲:

vector<list<Vocabolo>> hash; 
list<Vocabolo>::iterator it; 

這是類Vocabolo的一部分:

class Vocabolo { 
public: 
    Vocabolo(); 
    ~Vocabolo(); 

    void setVocabolo(Vocabolo); 
    string getVocabolo(); 

    bool operator== (Vocabolo); 

    string termine; 
    string tipo; 
}; 

這是重載方法==操作符:

bool Vocabolo::operator== (Vocabolo x) { 
    return getVocabolo() == x.termine; 
} 

不工作的方法!

bool HashV::Insert(Vocabolo nuovo) { 
    key = this->HashUniversale(nuovo.termine); 

    for (it = this->hash[key].begin(); it != this->hash[key].end(); it++) 
     if (it->termine == nuovo.termine) 
      return false; 
     else { 
      hash[key].push_back(nuovo); 
      return true; 
     } 
} 
+0

你推新的元素融入到你的'hash',同時在它的迭代。將新元素添加到矢量中可能會導致它將其內存釋放並使先前的迭代器無效。 – aslg

+0

請注意,當您立即返回時,您的循環將最多運行一次。 – Jarod42

回答

0

考慮使用的std :: find_if來代替:

auto itVoca = std::find_if(this->hash[key].begin(), this->hash[key].end(), [nuovo](const string& str) 
{ 
    return str != nuovo.termine; 
}); 

bool found = itVoca != this->hash[key].end(); 
if(found) hash[key].push_back(nuovo); 

return found; 
+0

似乎完美謝謝你,我必須嘗試一下! – stardust

+0

沒問題!您所擁有的「矢量下標超出範圍」錯誤可能是由於「密鑰」的值超出了矢量的範圍。 – KnightsWatch

+0

我沒有給這個向量的範圍。我的意思是我剛剛宣佈它,我認爲push_back會從0開始添加一個元素。函數是: ' int Hash :: HashUniversale(string nuovo){ \t int h = 0,a = 31415 ,b = 27183; (a * h + nuovo.at(i))%HASH_SIZE(012) ; \t h =(h <0)? (h + HASH_SIZE):h; \t return h; }' } 似乎無法獲得代碼標籤工作抱歉 – stardust