【问题标题】:I am trying to create a for loop with vector iterators我正在尝试使用矢量迭代器创建一个 for 循环
【发布时间】:2018-07-07 11:44:12
【问题描述】:

对于我的程序,我应该读取一个作业列表并从列表中“删除”错误的作业,并将新的作业列表写入输出文件。除了我的 Prune 函数出于某种原因按二进制计数并跳过向量中的偶数之外,这一切都正常工作。现在我明白了使用 .erase() 将列表移动一个并将计数器移动一个,但无法找到解决这个问题的方法。

void Prune()
{
    for (std::vector<Assignment>::iterator i = m_Assignments.begin(); i != m_Assignments.end())
    {
        if (!i->IsGood())
        {
           i = m_Assignments.erase(i);
           --i;
        }
        else
        {
            i++;
        }

    }
}

到目前为止,我已经尝试将计数器从 for 循环中取出并将其添加到主体中,并且还尝试在对象从向量中移除时递减计数器。

【问题讨论】:

  • 您的for() 似乎缺少;
  • 那是remove_if
  • --i; 看起来有点奇怪。由于i = m_Assignments.erase(i); 会将i 设置为删除元素之后的元素,--i 将导致程序重新扫描前一个元素,这可能是也可能不是你想要的,但想想如果你只是@987654329 会发生什么@d 第一个元素。
  • 好吧,我发现这不是我的代码,而是代码块和我使用的批处理文件,哈哈

标签: c++ for-loop vector iterator


【解决方案1】:

我相信您可以通过一个名为std::remove_if 的有用函数不必处理循环和迭代器来解决所有这些问题。这会将您的代码缩短为以下内容:

m_Assignments.erase(
    std::remove_if(m_Assignments.begin(), m_Assignments.end(), 
                   [](const Assignment& x) 
                   { 
                       return !x.IsGood(); 
                   })
    , m_Assignments.end()
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    相关资源
    最近更新 更多