我正在为一项任务编写一个程序——它应该是一个关于公司员工信息的数据库。基本上,一个包含结构(个体雇员)的向量。
我遇到的麻烦是remove_if会删除向量中的所有内容 - 而不是单个员工。
如果我正确理解文档/其他主题,该函数应该做两件事 - 重新排列向量的元素,并将迭代器返回到新范围之外的第一个元素 - 但它没有这样做,它返回一个迭代器到第一个element - 所以当 调用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 。
所以这个问题得到了回答。