推动有条件删除我想要做的事,如C#LINQ风格:C++从容器
SomeColection <SomeType> someColection;
someColection.Remove(something => something > 2);
,它会清除所有那些更大然后2的东西(或任何其他布尔条件)...
在项目中使用提升...
推动有条件删除我想要做的事,如C#LINQ风格:C++从容器
SomeColection <SomeType> someColection;
someColection.Remove(something => something > 2);
,它会清除所有那些更大然后2的东西(或任何其他布尔条件)...
在项目中使用提升...
首先更换bind2nd的东西,你需要一个简单的模板包装:
template <class Container, class UnaryPredicate>
void erase_if(Container& container, UnaryPredicate pred)
{
container.erase(
std::remove_if(container.begin(), container.end(), pred),
container.end()
);
}
这是一个众所周知的成语,但map
或set
因为他们维护他们自己的订单将不可能。
然后,您可以使用Boost.Lambda来获取您希望编写谓词本身的语法。
using boost::lambda::_1;
SomeCollection<Type> someCollection;
erase_if(someCollection, _1 > 2);
您不需要提升(除非您的主要焦点是内联匿名函数)。 Plain STL很好。
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
int main() {
std::vector<int> x (24);
for (int i = 0; i < x.size(); ++ i)
x[i] = i % 5;
std::vector<int>::iterator
new_end = std::remove_if(x.begin(), x.end(),
std::bind2nd(std::greater<int>(), 2));
x.erase(new_end, x.end());
for (int i = 0; i < x.size(); ++ i)
std::cout << x[i] << " ";
return 0;
}
有了提升,你可以用
#include <boost/lambda/lambda.hpp>
...
using boost::lambda::_1;
std::vector<int>::iterator new_end = std::remove_if(x.begin(), x.end(), _1 > 2);
+1。我只是用'std :: copy(x.begin(),x.end(),std :: ostream_iterator(std :: cout,“”));来替换输出行以隐藏循环。 ..但这只是一个品味:) – 2010-06-29 08:59:48
的C++ 0x(使用lambda表达式):
container.erase(std::remove_if(container.begin(), container.end(),
[](int v) { return v > 2; }),
container.end());
的原因erase
与remove_if
组合是STL算法适用于迭代器,而不是容器。他们重新定位容器的内容,但他们不会修改容器本身。
C++ 03:
container.erase(std::remove_if(container.begin(), container.end(),
std::bind2nd(std::greater<int>(), 2)),
container.end());
这似乎有点简单,但它也不太灵活,因为只有已经定义了这么多的谓词。对于更复杂的操作,您必须编写自己的谓词函子。
爱0x lambdas – DanDan 2010-06-29 09:20:04
我可以做MS视觉工作室? – 2010-06-29 09:27:35
@Hellfrost:如果你使用VS2010,你可以。 – 2010-06-29 09:34:27
通过的方式,升压::范围v.1.46.0(2011年发布)中有你想要什么 - 在remove_erase_if算法
#include <boost/range/algorithm_ext/erase.hpp
std::vector<int> vec = {1, 6, 2, 7};
boost::range::remove_erase_if(vec, [](int val){return val > 5;});
简短易懂。
为lambda表达式 – 2010-06-29 09:26:29