你能在std::unique_ptr容器上使用' std::remove_if '吗?
Can you use `std::remove_if` on a container of `std::unique_ptr`?
给定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
没有什么特别的,它只是另一个只能移动的类型。
N3290中25.3.8讲到remove函数:
要求:*first的类型必须满足MoveAssignable
和
注意:[ret,last)范围内的每个元素,其中ret是返回值值,具有有效但未指定的状态,因为算法可以通过与原来的元素交换或从原来的元素移动来消除元素
这意味着它取决于您的谓词操作符。因为您的谓词没有创建一个副本,所以元素不会被复制。
相关文章:
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 使用容器中元素的别名删除带有 std::list::remove 的元素是否正确?
- C++代码"x.erase(std::remove(x.begin(), x.end(), ), x.end())"是如何工作的?
- std::remove, std::move(range) and moved-from elements
- 在不同类型的向量上使用 std::remove 的不同结果
- 为什么 std::remove 不删除数组的最后一个元素
- std::remove 和 std::remove_if 设计的稳定性是否失败
- std::unordered_map:渐近{search,insert,remove}性能取决于密钥的大小和数据类型
- std::remove 不起作用
- 为什么std::whatever::erase()是一个方法,std::remove()是独立函数
- std::erase 和 std::remove 组合以删除特定元素不适用于特定示例
- std::remove函数中的转换错误
- 使用 std::erase 和 std::remove 从矢量中删除元素,不使用自定义结构作为值
- vector.erase 和 std::remove 在自定义向量上
- 需要了解 std::remove with vector.erase
- 为什么std::remove不能和std::set一起工作
- 如何为std::list重载std::remove
- std::remove导致编译错误
- Std::remove不是从Std::vector中移除
- 为什么std::remove取迭代器的const版本