Gle*_*leb 3 c++ containers stdmove
我正在编写一个类,该类需要用于过滤成员容器的高效函数(可以说std::vector)。此功能应具有类似于以下内容的界面:
void filter(std::vector<SomeType>& items, const std::vector<int>& inds);
Run Code Online (Sandbox Code Playgroud)
该函数应使容器items处于以下状态:-索引所指向的项目inds应被删除-其他项目应保留在容器中并保持初始顺序。
为简单起见,假设这inds是一个完美的容器,每个操作均带有O(1),并且所有索引均有效且无重复。
我的想法是创建第二个容器,保留所需的空间,然后将std::move所有未索引的元素(通过)移动inds到该新容器中;然后只需交换旧容器和新容器即可。
例如这样:
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);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
1)在(或其他标准容器)std::move内部的某个元素上使用后,vector是否会出现诸如双重破坏这些元素的问题?
2)是否有标准方法可以有效地进行此类过滤?
防止移动引起的问题不是集装箱的责任。只要要移动的项的类型具有定义正确且正确的move构造函数/隐式move构造函数,则将项从items移到new_items的方式与任何其他move操作相同;容器不会改变这一点。
简而言之,这种责任在于类,而不是它所使用的容器。