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

发布于 2024-11-03 17:40:21 字数 617 浏览 1 评论 0原文

我想将存储在未排序向量中的 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) );
}

我希望意图很明确。

更新我的算法不允许排序就地。如果有人今天感觉不错(我不是在问,请参阅上面的问题),请随意针对这种情况实施它并向我展示。我真的需要“按移动排序”。而且我真的不明白为什么搬家会贵很多。

I'd like to move the unique_ptr's stored in an unsorted vector of them to another vector, that will contain the sorted vector of pointers.

Surely moving a unique_ptr will not automatically erase the element in the first vector? How can I do this?

Example of what I want to do:

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) );
}

I hope the intent is clear.

UPDATE: my algorithm does not allow sorting in-place. If anyone is feeling nice today (I am not asking, see above for my question), feel free to implement it for this situation and show me. I really need the "sort by move". And I don't really see why the moving would be that much more expensive.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

懵少女 2024-11-10 17:40:21

你的代码对我来说基本上是正确的,除了它似乎就像你打算从未排序的向量中删除移动的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 中,如果不需要,则必须显式删除。

Your code looks basically correct to me, except that it seems like you intend for the moved-from unique_ptr to be erased from the unsorted vector:

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);
}

After the move it refers to a moved-from unique_ptr and *it == nullptr. It still exists in unsorted and if that is not desired, must be explicitly erased.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文