试图删除矢量指针重复项。为什么我不能使用 .erase()?
Trying to remove vector pointer duplicates. Why can't I use .erase()?
我的 "Faction" class 有一个指针向量,存储方式如下:
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
}
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 关于空向量会发生什么的评论。
不鼓励重新发明轮子。这是 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());
我的 "Faction" class 有一个指针向量,存储方式如下:
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
}
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 关于空向量会发生什么的评论。
不鼓励重新发明轮子。这是 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());