【问题标题】:remove_if erases everything from vectorremove_if 删除向量中的所有内容
【发布时间】:2018-06-07 15:39:55
【问题描述】:

我正在为一个作业编写一个程序 - 它应该是一个数据库 有关公司员工的信息。基本上,一个向量包含 结构(个人雇员)。

我遇到的麻烦是 remove_if 会删除向量中的所有内容 - 而不是单个员工。

如果我正确理解文档/其他主题,该功能应该 做两件事 - 重新排列向量的元素,并返回一个 迭代器到新范围之外的第一个元素 - 但它不这样做 它,它返回一个迭代器到第一个元素 - 所以当 erase() 函数被调用,所有元素被删除。至少 这是我调试时发现的。

这是我的代码的 mcve:

#include <iostream>
#include <vector>
#include <algorithm>
struct employee {
    int number;
};
int main()
{
    //creating the vector and adding some values to it
    employee one{ 1 };
    employee two{ 2 };
    employee three{ 3 };
    std::vector <employee> staff{ one, two, three };


    int m = 2; //some parameter I want to pass to lambda function
    auto it = std::remove_if(staff.begin(), staff.end(),
        [m](employee a) {
        if (a.number == 2)
            return true; }
    );
    staff.erase(it, staff.end());

    for (auto it = staff.begin(); it != staff.end(); it++)
        std::cout << it->number << std::endl;
    system("pause");
    return 0;
}

我意识到我可以在一个循环中做同样的事情 - 事实上,我做到了,但我无法理解为什么这种方法不起作用。此外,对于这个程序来说,一个列表可能是一个更好的选择(有了它,for 循环会花费更少的指令来计算),但是我已经完成了这个程序,现在我真的很想知道为什么没有 remove_if 工作。

谢谢!

编辑: 正如@drescherjm 指出的那样,这是因为当 if 时 lambda 函数没有返回 false em> 声明不符合。

所以问题得到了回答。

【问题讨论】:

  • 您的 lambda 不会返回 false。如果不满足您的条件,则没有返回值。这是未定义的行为。
  • 好点。来自 OP 的原始代码没有使用 m 的值。

标签: c++ remove-if erase-remove-idiom


【解决方案1】:

主要问题是当您的 lambda 条件不满足时,您没有返回值。这是不返回值的未定义行为。

auto it = std::remove_if(staff.begin(), staff.end(),
        [m](employee a) {
        if (a.number == 2)
            return true; }
);

一个简单的解决方案是删除 if 并返回条件。

auto it = std::remove_if(staff.begin(), staff.end(),
        [m](employee a) {
        return (a.number == 2);
        }
);

但是正如@killzonekid 提到的那样,这是不正确的,因为您仍然没有使用该参数。

auto it = std::remove_if(staff.begin(), staff.end(),
        [m](employee a) {
        return (a.number == m);
        }
);

将固定的 2 替换为 m 应该可以解决这个问题。

【讨论】:

    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多