我有一个指向我的“派系”类的指针,以这样的方式存储:
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 :(得分: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对空载体发生的事情的评论。