21

それらのソートされていないベクトルに格納されている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) );
}

意図が明確であることを願っています。

更新私のアルゴリズムでは、インプレースソートが許可されていません。今日誰かが気分がいいなら(私は尋ねていません、私の質問については上記を参照してください)、この状況のた​​めにそれを自由に実装して見せてください。私は本当に「移動による並べ替え」が必要です。そして、なぜ引っ越しがそれほど高価になるのか、私にはよくわかりません。

4

1 に答える 1

23

あなたのコードは基本的に私には正しいように見えますが、移動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 == nullptrunsorted

于 2011-04-26T16:02:37.663 に答える