【发布时间】:2011-12-07 12:04:07
【问题描述】:
给定一个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.)
【问题讨论】:
-
James Kanze 提问 - 一种非常罕见的现象!
-
unique_ptr不可复制,因此如果您使用该谓词,您的代码将无法编译。 -
为什么不呢?
std::unique不可复制但可移动。它可以移动到容器的末尾。 -
@KennyTM:但是问题中给出的谓词按值接受参数,因此需要一个复制构造函数。
-
@VJovic:不,他没有。他把那个谓词作为一个确实复制的例子。然后他对指针无效的说法不正确,
auto_ptr是这样,unique_ptr不是这样(代码根本无法编译)。