c – 你可以在`std :: unique_ptr`的容器上使用`std :: remove_if`?

给定一个std :: vector< std :: unique_ptr< SomeType> >是合法的使用
remove_if就可以了换句话说,给出这个代码
std::vector<std::unique_ptr<SomeType> > v;
//  fill v,all entries point to a valid instance of SomeType...
v.erase( std::remove_if( v.begin(),v.end(),someCondition ),v.end() );

我保证擦除之后仍然在v中的所有指针
有效.我知道给出直观的实现
std :: remove_if,并给出了我所看到的所有实现,
他们会.我想知道标准中有没有什么
保证它;即std :: remove_if不允许复制
任何有效条目,无需将副本重新复制到其最终
位置.

(我当然是假设条件不复制,如果
条件有如下特征:

struct Condition
{
    bool operator()( std::unique_ptr<SomeType> ptr ) const;
};

那么当然所有的指针都将无效
的remove_if.)

解决方法

N3290中的25.3.8说明删除功能

Requires: The type of *first shall satisfy the MoveAssignable
requirements (Table 22).

Note: each element in the range [ret,last),where ret is the returned
value,has a valid but unspecified state,because the algorithms can
eliminate elements by swapping with or moving from elements that were
originally in that range.

这意味着它取决于你的谓词操作符.由于您的谓词不创建副本,因此元素不会被复制.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...