C++ 为什么标准中没有提供擦除-删除习惯用法的方便助手?
从STL中的集合中删除项需要经常使用的一种技术,这种技术已成为习惯用法: 这个成语最常见的用法之一是从C++ 为什么标准中没有提供擦除-删除习惯用法的方便助手?,c++,stl,c++17,erase-remove-idiom,C++,Stl,C++17,Erase Remove Idiom,从STL中的集合中删除项需要经常使用的一种技术,这种技术已成为习惯用法: 这个成语最常见的用法之一是从向量中删除T类型的项 或 这显然可以扩展到 widget_collection.erase_remove_if(widget, pred); 等等。该问题包含在提案中,其中规定: 这是一个添加erase_if(容器,pred)的建议,使其 更容易正确有效地消除不需要的元素 [……] 从容器中消除不需要的元素非常困难, 给定一个区分“坏”元素和“好”元素的谓词 STL的主要优势之一是其所有容器都
向量中删除T
类型的项
或
这显然可以扩展到
widget_collection.erase_remove_if(widget, pred);
等等。该问题包含在提案中,其中规定:
这是一个添加erase_if(容器,pred)的建议,使其
更容易正确有效地消除不需要的元素
[……]
从容器中消除不需要的元素非常困难,
给定一个区分“坏”元素和“好”元素的谓词
STL的主要优势之一是其所有容器都具有相似的
接口-它们有许多共同的功能,并且遵循相同的原则
习俗。当容器接口不同时,它们之间的根本区别
他们的数据结构负责。即使是这些差异也常常会被忽略
由于STL的容器迭代器算法设计,已忽略
并注意到:
正确的回答
是使用“擦除-删除”成语,这是不明显的,必须教授
而不是被发现(它被称为“成语”是有原因的)
最新版本看起来像是。这是我们的一部分。有关详细信息,请参见CPP参考部分
Wandbox上提供的gcc的head修订版(版本6.0.0)实现了此head():
#包括
#包括
int main()
{
向量v1={1,2,3,4,5,6};
std::experimental::erase_if(v1,[](const int&x){return x<4;});
用于(常数自动和v:v1)
{
std::你能自己写吗?我有!:)我只是觉得这将是对
的一个相当简单的补充,这样所有人都可以从中受益it@SteveLorimer我也有。你专门研究list
吗?@curiousguy我没有,因为我只使用list::erase
。它当然可以变得更通用。我很高兴N4273
被接受,因为它肯定比我的实现更优雅,覆盖范围更广!谢谢!你知道我在哪里可以找到关于这些扩展的发布计划的信息吗?它们是C++14的一部分吗?@SteveLorimer不,我没有像核心工作组那样关注库的工作。但这里是他的建议。
widget_collection.erase_remove(widget);
std::erase_remove(widget_collection, widget);
widget_collection.erase_remove_if(widget, pred);
#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" ;
}