2015-05-31 28 views
0

我有一個指針的向量爲我的「派」類,存儲以這樣的方式:試圖刪除矢量指針重複。爲什麼我不能使用.erase()?

vector<Faction *> factionptr_; 

在這一點上,我已經能夠整理我的按字母順序排列矢量,所以我想我在這裏可以使用此代碼刪除會出現彼此相鄰的任何重複:

void Faction::deleteDuplicateFaction(vector<Faction *> &factionptr_){ 

for (int i = 0; i < factionptr_.size()-1; i++){ 

     if (factionptr_[i]->getFactionname() == factionptr_[i + 1]->getFactionname()){ 
      cout << "it's the same" << endl; 

      factionptr_.erase(factionptr(i)); 
     } 

但我發現了在.erase(錯誤),我不明白:

IntelliSense: no instance of overloaded function "std::vector<_Ty, _Alloc>::erase [with _Ty=Faction *, _Alloc=std::allocator<Faction *>]" matches the argument list 
     argument types are: (Faction *) 
     object type is: std::vector<Faction *, std::allocator<Faction *>> 

現在我明白我可以爲此使用迭代器,但我對它們還不太熟悉。儘管如此,我絕對不會反對使用迭代器的解決方案。

也許還有另一種方式?

factionptr是這樣的:

Faction * Faction::factionptr(int k) const{ 
if ((k < 0) or(k > numberOfFactions())) // elementary error checking 
     return NULL; 

return factionptr_[k]; // returns a pointer to the k-th daughter 

}

+0

'factionptr_'!='factionptr' – WhozCraig

+0

什麼是'factionptr'? – P0W

+0

for(int i = 0; i AlexanderVX

回答

4

車輪改造應該不鼓勵。這是std::unique,帶有一個簡單的自定義謂詞,然後是erase

auto pred = [](Faction* a, Faction* b) { 
       return a->getFactionname() == b->getFactionname(); 
      }; 
factionptr_.erase(std::unique(factionptr_.begin(), factionptr_.end(), pred), 
        factionptr_.end()); 
+0

@WhozCraig謝謝,我最初,不知何故在格式化過程中丟失了:) –

+0

不用擔心。我即將發佈相同的東西。 – WhozCraig

+0

謝謝,T.C.這工作。感謝所有幫助過的人。試着去了解這裏發生了什麼。 – imgoingmad

0

vector::erase不承擔其參數的值,只需要一個迭代(或一對迭代器)。 在你的情況,你有一個指標值(i),就可以得到正確的迭代器是這樣的:

factionptr_.erase(factionptr_begin()+i); 

注意,這將改變長度和您的陣列的內容,因此你的循環將無法正常工作如預期。解決這個問題的一個方法是隻在不要擦除元素時遞增i的值。

for (int i = 0; i < factionptr_.size()-1){ 

    if (factionptr(i)->getFactionname() == factionptr(i + 1)->getFactionname()){ 
      cout << "it's the same" << endl; 

      factionptr_.erase(factionptr_begin()+i); 
    } 
    else { 
      i++; 
    } 
} 

此外,還要注意whoiscraig關於空載矢量的評論。