remove_if从vector

时间:2017-12-26 23:06:34

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

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

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

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

这是我的代码的一部分:

#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循环会花费更少的计算指令),但我已经完成了程序,而且现在我真的想知道为什么没有删除_if工作。

谢谢!

编辑:正如@drescherjm指出的那,这是因为当时,lambda函数没有返回 false 声明未得到满足。

所以问题得到解答。

1 个答案:

答案 0 :(得分:2)

主要问题是当你的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);
        }
);

m替换固定的2应该注意这一点。