C++ 正在尝试删除向量指针重复项。为什么可以';我不能使用.erase()?

C++ 正在尝试删除向量指针重复项。为什么可以';我不能使用.erase()?,c++,class,pointers,vector,iterator,C++,Class,Pointers,Vector,Iterator,我的“派系”类有一个指针向量,存储方式如下: vector<Faction *> factionptr_; ptr; 在这一点上,我已经能够按照字母顺序对向量进行排序,所以我想我可以在这里使用这些代码来删除任何出现在彼此旁边的重复项: void Faction::deleteDuplicateFaction(vector<Faction *> &factionptr_){ for (int i = 0; i < factionptr_.size()-

我的“派系”类有一个指针向量,存储方式如下:

vector<Faction *> factionptr_;
ptr;
在这一点上,我已经能够按照字母顺序对向量进行排序,所以我想我可以在这里使用这些代码来删除任何出现在彼此旁边的重复项:

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));
      }
void派系::删除重复派系(向量和派系){
对于(int i=0;iget派系名称()==派系ptr[i+1]->get派系名称()){
cout numberOfFacties())//基本错误检查
返回NULL;
return particptr_k];//返回指向第k个子元素的指针

}

向量::擦除不接受其参数值,它只接受一个迭代器(或一对迭代器)。 在您的情况下,由于您有一个索引值(
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++;
     }
}
for(int i=0;iget派系名称()==派系ptr(i+1)->get派系名称()){

cout
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++;
     }
}
for(int i=0;iget派系名称()==派系ptr(i+1)->get派系名称()){

cout不鼓励重新创建控制盘。这是一个简单的自定义谓词,后跟一个
erase

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

不鼓励重新创建控制盘。这是一个简单的自定义谓词,后跟一个
擦除

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


particptr
!=
particptr
什么是
particptr
?@AlexanderVX如果向量为空,这也是一场灾难。你似乎在寻找带有自定义谓词的
std::unique
,后跟
erase
一个la-erase-remove习惯用法。如果向量为空,则
size()-1
可能不会执行您认为会执行的操作。
size()
返回一个无符号整数类型。。如果这些指针是引用这些
section
对象的唯一指针,则这(您的代码或TC)将泄漏这些对象。最好不要使用指针,除非您出于多态性原因这样做,并且在这方面使用智能指针,如
std::unique\u ptr
std::shared\u ptr
。无论如何,祝您好运。
particptr
!=
particptr
什么是
particptr
如果向量为空,这也是一场灾难。您似乎正在使用自定义谓词查找
std::unique
,后跟
erase
a la the erase remove成语。如果向量为空,则
size()-1
可能不会执行您认为会执行的操作。
size()
返回一个无符号整数类型。如果这些指针是引用那些
派别
对象的唯一指针,则这(您的代码或TC)将泄漏这些对象。最好不要使用指针,除非您这样做是出于多态性原因,在这方面,请使用智能指针,如
std::unique\u ptr
std::shared\u ptr
。无论如何,祝您好运。@WhozCraig谢谢,我最初使用过它,但在格式化过程中不知怎么弄丢了:)不用担心。我是关于t的o发布同样的东西。谢谢,T.C。这很有效。谢谢所有其他帮助过我的人。我要试着去了解一下这里发生了什么。@imgoingmad花一些时间仔细阅读。注意这个网站作为一般参考非常棒,所以把它放在你的书签栏上。@WhozCraig谢谢,我最初有它,在格式化过程中不知怎么弄丢了:)不用担心.我正要发布同样的东西。谢谢,T.C.这很有效。谢谢所有其他帮助过我的人。我要试着去了解这里发生了什么。@imgoingmad花点时间仔细阅读。注意,这个网站作为一般参考非常棒,所以把它放在你的书签栏上。