gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:07:59 24 4
gpt4 key购买 nike

我正在编写一个需要高效函数来过滤成员容器的类(比方说std::vector)。此函数应具有类似于以下的界面:

void filter(std::vector<SomeType>& items, const std::vector<int>& inds);

该函数应使容器 items 处于以下状态:- 应删除 inds 中的索引指向的项目- 其他元素应保留在容器中以保持初始顺序。

为简单起见,我们假设 inds 是一个完美的容器,每个操作的复杂度为 O(1),并且所有索引都有效且没有重复。

我的想法是创建第二个容器,保留所需的空间,然后将所有未被 inds 索引的元素移动(通过 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) 在 vector(或通常任何其他标准容器)内的某些元素上使用 std::move 后,是否会出现这些元素的双重破坏等问题?

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

最佳答案

容器没有责任防止搬家可能引起的问题。只要移动的项目的类型具有明确定义且正确的移动构造函数/隐式移动构造函数,然后将项目从 items 移动到 new_items 与任何其他项目相同移动操作;容器不会改变这一点。

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

关于c++ - 从标准容器中移动元素是否合法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57674136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com