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

时间:2011-12-07 12:04:07

标签: c++ c++11

鉴于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。)

2 个答案:

答案 0 :(得分:5)

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

正如您所指出的,谓词当然应该通过const-reference来获取元素。再次,就像任何可移动类型一样。

答案 1 :(得分:2)

N3290中的

25.3.8谈到删除功能:

  

要求:* first的类型应满足MoveAssignable   要求(表22)。

  

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

这意味着它取决于您的谓词运算符。由于您的谓词不会创建副本,因此不会复制元素。