gpt4 book ai didi

c++ - 如何使用erase和iterator删除二维 vector 中的某一项?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:43 25 4
gpt4 key购买 nike

一个二维 vector :(我想遍历 vector ,如果我找到与“and”相同的名称,则删除或删除它,但为什么它只能使用 it1 而不是 it2?如何解决? )

vector<Animals>numberOfAnimals(12);
vector<vector<Animals>>all(4,numberOfAnimals);

void delete_item(vector<vector<Animals>>&all,string ans)
{
for (auto it1=all.begin();it1!=all.end();it1++)
{
for (auto it2=(*it1).begin();it2!=(*it1).end();it2++)
{
if ((*it2).getter_name()==ans)
{
all.erase(it1); //no error
all.erase(it2--); //error
}
}
}
}

最佳答案

all 是 vector 的 vector 。 it1all 的迭代器,所以它可以传递给all.eraseit1 指的是 all 中的 vector 之一。

it2 不是all 的迭代器,因此不能传递给all.eraseit2 是 vector *it1 的迭代器,后者是 Animals 的 vector 。 it2 可以传递给it1->eraseit2 指的是 *it1 中的 Animals 之一。


但是,请注意,删除 vector 的迭代器会使它无效。 it1it2 仍在循环中以不允许在无效迭代器上执行的方式使用。因此在循环中使用 erase 而不修复迭代器具有未定义的行为。

有选择地删除容器中某些元素的惯用方法是删除-删除:

auto predicate = [&ans](const Animals& a) {
return a.getter_name()==ans;
};
for(std::vector<Animals>& v : all) {
v.erase(std::remove_if(v.begin(), v.end(), predicate));
}

这会删除所有 Animalsall 中的每个 vector 中的谓词相匹配。

关于c++ - 如何使用erase和iterator删除二维 vector 中的某一项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58612474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com