【问题标题】:Deleting element in row of 2D Vector - With Iterators删除二维向量行中的元素 - 使用迭代器
【发布时间】:2016-09-24 17:20:01
【问题描述】:

我有一个“Entry”对象的 7x20 2D 矢量。 Entry 对象有一个 ID。我想遍历我的向量并执行:

if( idToDelete == entry.getID() )
    //Delete entry

目前代码如下:

for(auto day : entryRegister)
{
    for(auto entry : day)
    {
        if(entryID == entry.getID())
        {
            //Delete Entry
        }
    }
}

我不确定如何制定表达式以实际删除项目。我试过entryRegister[day].erase(entry),但我得到一个错误,因为没有找到在方括号中使用迭代器的运算符。

我看到了申报EntryRegister的请求。相关信息只是声明如下:vector< vector<Entry> >,有7列,每列最多20行。

getID 返回一个无符号字符,它是介于 1 和 70 之间的某个值。

这是一个函数的一部分,我在其中传递了一个我希望删除的 ID。然后我遍历寄存器,并删除具有该 ID 的所有条目。

【问题讨论】:

  • 让我们看看entryRegisterday的声明。和你一样getID(),你不能把你自己的函数写在后面给deleteID()吗?

标签: c++ vector iterator 2d-vector


【解决方案1】:

C++ 在向量中没有“删除值”功能,因为它可以通过两个更基本的步骤来完成,通常称为erase-remove idiom

  1. 找到向量中与值相等的所有项,并将它们交换到向量的末尾,使用std::remove or remove_if
  2. 使用std::vector::erase调整向量大小以删除那些找到的项目

注意erase 需要一个或两个迭代器。它只支持擦除您已经知道位置的项目。

for (auto& day : entryRegister) {
    auto erase_begin = std::remove_if(
                day.begin(),
                day.end(),
                [=](const Entry& entry) { return entry.EntryID() == entryID; }
    );
    day.erase(erase_begin, day.end());
}

请注意,我将 entryRegister 循环更改为通过引用获取 day,因此更改实际上会影响真实的一天而不是副本。

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多