【问题标题】:How to use erase and iterator to delete a item in the two-dimension vector?如何使用擦除和迭代器删除二维向量中的项目?
【发布时间】:2019-10-29 17:18:45
【问题描述】:

一个二维向量:(我想通过向量,如果找到与“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
            }
        }
    }
}

【问题讨论】:

  • 运算符-&gt;可以代替(*it).。例如it1-&gt;end() 而不是(*it1).end()
  • it1all 的迭代器,它是vector&lt;vector&lt;Animals&gt;&gt; 类型,其中it2vector&lt;Animals&gt; 的迭代器;你想做it1-&gt;erase(it2)
  • vector&lt;Animals&gt; 可能不是你想的那样。该向量中的每个元素都包含 one AnimalsAnimals 的定义是怎样的?

标签: c++ xcode vector iterator


【解决方案1】:

all 是向量的向量。 it1all 的迭代器,因此可以传递给all.eraseit1 指的是all 中的向量之一。

it2 不是all 的迭代器,因此不能传递给all.eraseit2 是向量 *it1 的迭代器,它是 Animals 的向量。 it2 可以传递给it1-&gt;eraseit2 指的是*it1 中的Animals 之一。


但是,请注意,将迭代器擦除为向量会使其无效。 it1it2 仍在循环中以不允许在无效迭代器上完成的方式使用。因此在循环中使用erase 而不修复迭代器具有未定义的行为。

选择性地擦除容器的某些元素的惯用方法是erase-remove:

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));
}

这将删除与all 内每个向量中的谓词匹配的所有Animals

【讨论】:

    猜你喜欢
    • 2021-01-02
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多