listの要素位置を移動する

splice()メンバ関数を使用して、std::listの要素位置を移動できるようです。

#include <iostream>
#include <list>
#include <iterator>

int main()
{
    std::list<int> ls = {1, 2, 3, 4, 5};

    // 0番目の要素を、2番目に移動
    ls.splice(std::next(ls.begin(), 2 + 1), ls, ls.begin());

    for (int x : ls) {
        std::cout << x << std::endl;
    }
}

出力:

2
3
1
4
5

移動元のイテレータは、無効になりません。

#include <iostream>
#include <list>
#include <iterator>

int main()
{
    std::list<int> ls = {1, 2, 3, 4, 5};

    // 0番目の要素を、2番目に移動
    decltype(ls)::iterator from = ls.begin();
    decltype(ls)::iterator to = std::next(ls.begin(), 2 + 1);
    ls.splice(to, ls, from);

    std::cout << *from << std::endl;
}

出力:

1

いちおう、std::forward_listの例:

#include <iostream>
#include <forward_list>
#include <iterator>

int main()
{
    std::forward_list<int> ls = {1, 2, 3, 4, 5};

    // 0番目の要素を、2番目に移動
    ls.splice_after(std::next(ls.before_begin(), 2 + 1),
                    ls,
                    ls.before_begin());

    for (int x : ls) {
        std::cout << x << std::endl;
    }
}

出力:

2
3
1
4
5

参照