试图删除矢量指针重复。为什么我不能使用.erase()?

时间:2015-05-31 03:42:59

标签: c++ class pointers vector iterator

我有一个指向我的“派系”类的指针,以这样的方式存储:

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

}

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分:0)

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++; } } 值。

[System.Reflection.Assembly]

还要注意whoiscraig对空载体发生的事情的评论。