鉴于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
。)
答案 0 :(得分:5)
就像erase()
和resize()
一样,remove_if()
将移动元素(可能通过交换),因此容器元素不需要是可复制的。 unique_ptr
并没有什么特别之处,它只是另一种移动类型。
正如您所指出的,谓词当然应该通过const-reference来获取元素。再次,就像任何可移动类型一样。
答案 1 :(得分:2)
25.3.8谈到删除功能:
要求:* first的类型应满足MoveAssignable 要求(表22)。
和
注意:范围[ret,last]中的每个元素,其中ret是返回的 值,具有有效但未指定的状态,因为算法可以 通过与元素交换或移动元素来消除元素 最初在那个范围内。
这意味着它取决于您的谓词运算符。由于您的谓词不会创建副本,因此不会复制元素。