Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么标准中没有提供擦除-删除习惯用法的方便助手?_C++_Stl_C++17_Erase Remove Idiom - Fatal编程技术网

C++ 为什么标准中没有提供擦除-删除习惯用法的方便助手?

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的主要优势之一是其所有容器都

从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" ;
}