std::listについて、おたずねしたいのですが。
よろしくお願いします。
std::list<int> intList;
for(int i=1; i<=10; i++){
intList.push_back(i);
}
この状態から、たとえば、
3番目の要素と7番目の要素を入れ替えて、
1 2 "7" 4 5 6 "3" 8 9 10
としたいのです。
しかし、listには標準の関数に2つの要素の入れ替えのものが、
ないように思うのです。
初心者の私が普通に考えると、
要素入れ替えの関数が、
存在していてもいいような気がするのですが。
あるのでしょうか?
オンラインで調べても、
全要素並べ替え、sortの説明はたくさんでてくるのですが、
特定の位置の入れ替えの参考文献が、
ありません。
あまりに常識の情報過ぎて、
載っていないのでしょうか。
恐れ入りますが、
要素入れ替えのstd::listによるスマートな実装は、
どのようになるのか、
ヒントをいただけないでしょうか。
よろしくお願いします。
こんなのがありますよ。
std::swap, std::iter_swap
詳しくはこちらを参照のほど。↓
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/algorithm.html#swap
> std::swap, std::iter_swap
--- example ---
#include <iostream>
#include <algorithm>
#include <iterator>
#include <list>
int main() {
std::list<int> intList;
for(int i=1; i<=10; i++){
intList.push_back(i);
}
std::list<int>::iterator iter3 = intList.begin();
std::advance(iter3, 3-1);
std::list<int>::iterator iter7 = intList.begin();
std::advance(iter7, 7-1);
std::iter_swap(iter3, iter7); // ←コレ
//std::swap(*iter3, *iter7); // ←またはコレ
std::copy(intList.begin(), intList.end(),
std::ostream_iterator<int>(std::cout, " "));
}
DDさん、επιστημηさん、
ありがとうございます!
やっぱり存在していたのですね(涙)
STLのコンテナ+algorithmのセット
という使い方が常識すぎて、
参考文献には載っていなかったのでしょうか。
精進します。
本当に、ありがとうございました。
参考文献って、何のドコを読んだのかしら…
もう解決してかなり時間が経ってますけど、
これって要素の「中身」の交換じゃなくて、「位置」の交換がしたかったのでは。
要素が大きい場合、リストの繋ぎ替えの方が安く付くから云々……
と思ったけど初心者と自称してるからそういうわけでもないのかな。
> これって要素の「中身」の交換じゃなくて、「位置」の交換がしたかったのでは。
だとするとかなり面倒。std::listにはlinkの付け替えができるメソッドは限定されています。
spliceか何かでできるだろうけど。
高速交換を希望するなら list<int*> にするが吉。
ツイート | ![]() |