[英]Is it legal to move elements from standard containers?
我正在编写一个类,该类需要用于过滤成员容器的高效函数(让我们说std::vector
)。 此功能应具有类似于以下内容的界面:
void filter(std::vector<SomeType>& items, const std::vector<int>& inds);
该函数应使容器items
处于以下状态:-应该删除inds
索引所指向的项目-其他项目应保留在容器中并保持初始顺序。
为了简单起见,假设inds
是在每个操作上都具有O(1)的理想容器,并且所有索引均有效且没有重复。
我的想法是创建第二个容器,保留所需的空间,然后将所有未被inds
索引的元素(通过std::move
) std::move
到该新容器中; 然后只需交换旧容器和新容器即可。
例如这样:
void filter(std::vector<SomeType>& items, const std::vector<int>& inds)
{
std::vector<SomeType> new_items{};
new_items.reserve( items.size() - inds.size() );
for(size_t i = 0; i < items.size(); ++i)
if( contains( inds, i ) ) // magic O(1) function, never mind
new_items.push_back( std::move( items[i] ) );
items.swap(new_items);
}
我的问题是:
1)在使用std::move
在vector
某个元素上(或通常在其他标准容器中)移动之后,是否会出现诸如双重破坏这些元素的问题?
2)是否有标准方法可以有效地进行此类过滤?
防止移动引起的问题不是集装箱的责任。 只要所移动项目的类型具有定义正确的正确的move构造函数/隐式move构造函数,则将这些项目从items
移动到new_items
的方式与任何其他move操作相同; 容器不会改变这一点。
简而言之,这种责任在于类,而不是它所使用的容器。
从中移出的对象处于有效但未指定的状态,并且可以在没有前提条件的情况下调用它们。 析构函数必须是没有先决条件的函数。 如果SomeType
此条件,则其SomeType
。
因此,不会有双重破坏的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.