9

右辺値参照がどのように機能するかはかなりよく理解していますが、STLのイテレーターでどのように機能するかは正確にはわかりません。これが私が欲しいものです:

void insertList(std::list<int>& L, std::list<int>&& R, std::list<int>::iterator insertPoint)
{
    L.insert(insertPoint, R.begin(), R.end()); // want to use move semantics
}

これで、std::listにspliceメソッドがあることがわかりました。しかし、これがまったく機能するかどうかを知りたいです。dequeでも機能しますか?

4

2 に答える 2

13

コンテナの内容の移動と移動は別の操作spliceですsplice(では実行できません)の場合deque、ノード全体が1つのコンテナーから別のコンテナーに転送されます。ノードは元のコンテナに存在しなくなり、操作による割り当ては実行されなくなります。

あなたが述べたものと同様のアルゴリズムでコンテンツを移動する代わりに、移動イテレータを使用します。

L.insert(insertPoint, 
         std::make_move_iterator(R.begin()), 
         std::make_move_iterator(R.end()));

これは両方listで機能しdequeますが、セマンティクスは異なります。新しいリストに挿入するには、ノードの割り当てが必要になります。std::distance(R.begin(),R.end())ノードの内容は、元のコンテナから移動することで埋められます。これにより、新しいノードの作成コストが削減されますが、それでもノードを割り当てる必要があります。データの内容が移動されたためノードは空になりますが、古いリストには引き続きすべてのノードが含まれることに注意してください。

あなたの場合std::listは好むべきですspliceが、それは他のコンテナでは利用できません。他のコンテナの場合は、上記のアプローチが必要になります。この場合、コンテナデータ構造の構築コストを負担する必要がありますが、保存されたデータの作成コストは回避できます。

于 2012-09-27T21:40:09.820 に答える
5

あなたが欲しいstd::make_move_iterator()

L.insert(
    insertPoint,
    std::make_move_iterator(R.begin()),
    std::make_move_iterator(R.end())
);
于 2012-09-27T21:26:48.810 に答える