该问题已由提案涵盖N4009:统一容器擦除 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4009.htm其中说:
这是添加erase_if(container, pred)的建议,使其
更容易正确有效地消除不需要的元素。
[...]
从容器中消除不需要的元素是非常困难的,
给定一个区分“坏”元素和“好”元素的谓词。
STL 的主要优势之一是它的所有容器都具有相似的
接口 - 它们有许多共同的功能并且遵循相同的原则
惯例。当容器接口不同时,之间的根本区别
他们的数据结构负责。即使这些差异也常常是
由于 STL 的容器迭代器算法设计,它被忽略了。
并且还指出:
正确的反应
是使用擦除-删除惯用语,这是不明显的,必须教授
而不是被发现(出于某种原因,它被称为“习语”)。
最新版本N4273:统一容器擦除(修订版 2) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4273看起来好像是adopted http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/sd-1.htm。它是一部分Library Fundamentals V2 的扩展 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4336.html。另请参阅 cppreference 部分C++ 标准库扩展,版本 2 http://en.cppreference.com/w/cpp/experimental/lib_extensions_2.
头部修订(版本6.0.0)Wandbox 上可用的 gcc 具有此标头的实现(现场观看 http://melpon.org/wandbox/permlink/1fo2VHdnr1MzD5t1):
#include <experimental/vector>
#include <iostream>
int main()
{
std::vector<int> v1 = {1,2,3,4,5,6} ;
std::experimental::erase_if( v1, [] (const int &x ) { return x < 4; } ) ;
for( const auto & v : v1 )
{
std::cout << v << ", " ;
}
std::cout << "\n" ;
}
这段代码也适用于网络编译器 http://webcompiler.cloudapp.net/这似乎证实了 T.C. 的建议,即这也随 MSVC 2015 一起提供。