remove_if 擦除向量中的所有内容
remove_if erases everything from vector
我正在为一项作业编写程序 - 它应该是一个数据库
有关公司员工的信息。基本上,一个向量包含
结构(个体雇员)。
我遇到的麻烦是 remove_if 从矢量中删除了所有内容 - 而不是单个员工。
如果我正确理解 documentation/other 个主题,该函数应该
做两件事 - 重新排列向量的元素,然后 return
迭代到新范围之外的第一个元素 - 但它不这样做
它,它 return 是第一个元素的迭代器 - 所以当
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 指出的那样,这是因为 lambda 函数没有 return false 当 if 语句不满足时。
所以问题得到解答
主要问题是当您的 lambda 条件不满足时,您没有 return输入值。这是不 return 值的未定义行为。
auto it = std::remove_if(staff.begin(), staff.end(),
[m](employee a) {
if (a.number == 2)
return true; }
);
一个简单的解决方案是删除 if,只删除 return 条件。
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
应该可以解决这个问题。
我正在为一项作业编写程序 - 它应该是一个数据库 有关公司员工的信息。基本上,一个向量包含 结构(个体雇员)。
我遇到的麻烦是 remove_if 从矢量中删除了所有内容 - 而不是单个员工。
如果我正确理解 documentation/other 个主题,该函数应该 做两件事 - 重新排列向量的元素,然后 return 迭代到新范围之外的第一个元素 - 但它不这样做 它,它 return 是第一个元素的迭代器 - 所以当 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 指出的那样,这是因为 lambda 函数没有 return false 当 if 语句不满足时。
所以问题得到解答
主要问题是当您的 lambda 条件不满足时,您没有 return输入值。这是不 return 值的未定义行为。
auto it = std::remove_if(staff.begin(), staff.end(),
[m](employee a) {
if (a.number == 2)
return true; }
);
一个简单的解决方案是删除 if,只删除 return 条件。
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
应该可以解决这个问题。