【问题标题】:Moving unique_ptrs from one vector to another将 unique_ptrs 从一个向量移动到另一个向量
【发布时间】:2011-08-13 03:46:33
【问题描述】:

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

我希望意图很明确。

更新:my algorithm 不允许就地排序。如果今天有人感觉很好(我不是在问,我的问题见上文),请随时针对这种情况实施它并向我展示。我真的需要“按动作排序”。而且我真的不明白为什么搬家会那么贵很多。

【问题讨论】:

    标签: c++ c++11 move-semantics unique-ptr


    【解决方案1】:

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

    【讨论】:

    • 谢谢! it 在move 之后的“内容”是什么?您的解决方案看起来不错而且很干净,正是我正在寻找的,但是在move 操作之后我对it 感到困惑。 (完全题外话:不能等待 libc++ 在 Windows 上运行!)
    • 在我看来,it 是向量的迭代器,因为您使用它的方式。如果是这样,it 指的是一个 unique_ptr。移动后,unique_ptr 将等于 nullptr。
    • 是的,好的。我不知道。
    • 这似乎可以解决问题,尽管 OP 代码中概述的算法似乎与链接文章中的算法不同。
    • Mark B:我没有在这里写算法,因为它与我在这里尝试做的事情无关。我给出的示例代码将成为算法的一部分(在链接的最后一个代码块中,此答案中的 push_back 和 erase 将替换最后两行(append 和 remove 调用))跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2019-08-13
    • 1970-01-01
    • 2020-07-01
    • 2012-08-09
    • 1970-01-01
    相关资源
    最近更新 更多