将unique_ptr从一个向量移动到另一个向量

23

我想将存储在未排序的unique_ptr向量中的指针移动到另一个向量中,该向量将包含指针的已排序向量。

移动unique_ptr不会自动擦除第一个向量中的元素,如何实现这一点?

我想要做的示例:

std::vector<std::unique_ptr<T> > unsorted, sorted;
// fill the "unsorted" vector
while( unsorted.size() > 0 )
{
    const auto it = find_next_element_to_add_to_sorted(unsorted);
    sorted.push_back( std::move(*it) );
}

我希望意图清晰明确。

更新: 我的算法 不允许原地排序。如果今天有人心情好(我并不是在请求,请参见上面的问题),可以为这种情况实现它并向我展示。我真的需要“按移动排序”。我不太明白为什么移动会更加昂贵。

1个回答

25

你的代码基本上看起来是正确的,除了似乎你打算从未排序的向量中删除移动的 unique_ptr

std::vector<std::unique_ptr<T> > unsorted, sorted;
// fill the "unsorted" vector
while( unsorted.size() > 0 )
{
    const auto it = find_next_element_to_add_to_sorted(unsorted);
    sorted.push_back( std::move(*it) );
    unsorted.erase(it);
}

移动后,it指向一个被移动的 unique_ptr 对象,并且 *it == nullptr。它仍然存在于unsorted中,如果不希望存在,则必须显式地将其删除。


1
谢谢!在move操作之后,“it”的“内容”是什么?你的解决方案看起来很好,很干净,也正是我想要的,但是我对move操作之后的“it”感到困惑。(完全离题:迫不及待地希望libc++在Windows上能够正常运行!) - rubenvb
根据你的使用方式,我认为it是一个指向vector的迭代器。如果是这样的话,it将会指向一个unique_ptr。移动后,该unique_ptr将会等于nullptr。 - Howard Hinnant
是的,好的。我不知道那个。 - rubenvb
这似乎可以解决问题,尽管OP代码中概述的算法似乎与链接文章中的算法不同。 - Mark B
@David:我知道,这可能是个“坏”习惯。 - rubenvb
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接