【发布时间】:2016-03-23 15:36:17
【问题描述】:
考虑以下场景:
bool is_odd(int i)
{
return (i % 2) != 0;
}
int main()
{
// ignore the method of vector initialization below.
// assume C++11 is not to be used.
std::vector<int> v1 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
std::vector<int> v2 = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
// removes all odd numbers, OK
v1.erase( std::remove_if(v1.begin(), v1.end(), is_odd), v1.end() );
// remove all even numbers
v2.erase( std::remove_if(v2.begin(), v2.end(), ???), v2.end() );
}
我可以使用相同的is_odd() UnaryPredicate 来删除main() 最后一行中预期的偶数吗?或者我是否必须写一个is_even(),即使它只是:
bool is_even(int i)
{
return !is_odd(i);
}
【问题讨论】:
-
如果你有 C++11,lambda 是最简单的:
[](int i){ return !is_odd(i);},我会声称比not1更清晰。 -
很抱歉注意到大括号前的 =
-
@HumamHelfawi:即使使用
=,上面的代码也需要 C++11!在 C++11 之前,没有直接的方法可以用 C++ 中的一系列元素初始化std::vector(或任何其他标准库容器)。做到这一点的方法是创建一个数组,然后使用容器的构造对数组使用迭代器。 -
我也很震惊,但我在 stackoverflow 上阅读了一些答案,建议提问者在没有 c++11 时使用它,他称之为数组初始化而不是初始化列表
-
添加了
C++03标签。当前标准是 C++14;当我只看到 C++ 时,我假设是一个相当新的编译器。 (虽然工作中不是这样,但生活就是这样)。
标签: c++ c++03 erase-remove-idiom