你能在std::unique_ptr容器上使用' std::remove_if '吗?

Can you use `std::remove_if` on a container of `std::unique_ptr`?

本文关键字:std remove if unique ptr      更新时间:2023-10-16

给定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)。

就像erase()resize()一样,remove_if()移动元素(可能通过交换),因此容器元素不需要是可复制的。unique_ptr没有什么特别的,它只是另一个只能移动的类型。

正如您所指出的,谓词当然应该通过const-reference获取元素。和其他可移动字体一样

N3290中25.3.8讲到remove函数:

要求:*first的类型必须满足MoveAssignable

注意:[ret,last)范围内的每个元素,其中ret是返回值值,具有有效但未指定的状态,因为算法可以通过与原来的元素交换或从原来的元素移动来消除元素

这意味着它取决于您的谓词操作符。因为您的谓词没有创建一个副本,所以元素不会被复制。