0

リストやベクターなどの C++ コンテナーで高速なスワップ メソッドがどのようなものか疑問に思っています。組み込みのスワップ関数がまだ見つからないためです。参考までに、リスト全体ではなくオブジェクトをスワップしたいと考えています。

たとえば、int シーケンス 3 2 4 5 があり、それらがリスト コンテナー (stl) に格納されているとします。2 と 4 を入れ替えたいとします。

list<int> numbers;
numbers.push_back(3);
numbers.push_back(2);
numbers.push_back(4);
numbers.push_back(5);
list<int>::iterator item;
item=numbers.begin();
advance(item,2);
int key = *item;
advance(item,-1);
numbers.insert(item,key);
advance(item,1);
numbers.erase(item);

簡単に言えば、私がここで行っているのは「コピー、挿入、および削除」です。これを行う理由は、要素の挿入と削除にはリスト コンテナーが非常に効率的であると聞いたからです。また、ポインタ関連の一定時間スワップ法もあると聞いたので、ご存知の方はいらっしゃいますか?</p>

助けてくれてありがとう。

4

5 に答える 5

5

あなたがしたいstd::swap

list<int>::iterator item1 = numbers.begin();
++item1;
list<int>::iterator item2 = item1;
++item2;
std::swap(*item1, *item2);
于 2013-07-18T21:19:23.397 に答える
5

iter_swap2 つの反復子が指す要素をリストにスワップするために使用します。これはノードではなくデータを交換しますが、簡単です。

#include <list>
#include <iostream>

int main() {
    std::list<int> numbers;
    numbers.push_back(3);
    numbers.push_back(2);
    numbers.push_back(4);
    numbers.push_back(5);

    auto first = std::next(numbers.begin(), 2);
    auto second = std::next(numbers.begin(), 1);
    std::iter_swap(first, second);

    for(int& v : numbers) 
        std::cout << v << ' ';
}

http://coliru.stacked-crooked.com/view?id=a89b3b1ae9400367b6ff194d1b504e58-f674c1a6d04c632b71a62362c0ccfc51

要素ではなくノードを交換したい場合はlist::splice、少しトリッキーですが、 を使用できます。

int main() {
    std::list<int> numbers;
    numbers.push_back(3);
    numbers.push_back(2);
    numbers.push_back(4);
    numbers.push_back(5);

    std::list<int> temporary;
    auto move_from = std::next(numbers.begin(), 2);
    temporary.splice(temporary.begin(), numbers, move_from, std::next(move_from));
    auto move_to = std::next(numbers.begin(), 1);
    numbers.splice(move_to, temporary);

    for(int& v : numbers) 
        std::cout << v << ' ';
}
于 2013-07-18T21:20:35.033 に答える
2

実際の要素をコピーせずに、リスト内のノードを移動する方法を探しているようです。list::splice でこれを行うことができます。もちろん、ノードベースではないベクトルでは、そのようなことはできません。

このようなもの:

list<int>::iterator to = numbers.begin();
++to;
list<int>::iterator which  = to;
++which;
numbers.splice(to, numbers, which);
于 2013-07-18T21:25:13.937 に答える