繁体   English   中英

从标准容器中移动元素是否合法?

[英]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::movestd::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::movevector某个元素上(或通常在其他标准容器中)移动之后,是否会出现诸如双重破坏这些元素的问题?

2)是否有标准方法可以有效地进行此类过滤?

防止移动引起的问题不是集装箱的责任。 只要所移动项目的类型具有定义正确的正确的move构造函数/隐式move构造函数,则将这些项目从items移动到new_items的方式与任何其他move操作相同; 容器不会改变这一点。

简而言之,这种责任在于类,而不是它所使用的容器。

从中移出的对象处于有效但未指定的状态,并且可以在没有前提条件的情况下调用它们。 析构函数必须是没有先决条件的函数。 如果SomeType此条件,则其SomeType

因此,不会有双重破坏的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM