std::listの要素の入れ替えについて

解決


ハリーボッター  2005-12-30 19:53:07  No: 60134

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によるスマートな実装は、
どのようになるのか、
ヒントをいただけないでしょうか。

よろしくお願いします。


DD.  2005-12-30 21:28:53  No: 60135

こんなのがありますよ。

std::swap, std::iter_swap

詳しくはこちらを参照のほど。↓
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/algorithm.html#swap


επιστημη  2005-12-31 00:46:59  No: 60136

> 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, " "));
  
}


ハリーボッター  2005-12-31 13:45:12  No: 60137

DDさん、επιστημηさん、
ありがとうございます!
やっぱり存在していたのですね(涙)

STLのコンテナ+algorithmのセット
という使い方が常識すぎて、
参考文献には載っていなかったのでしょうか。

精進します。
本当に、ありがとうございました。


επιστημη  2005-12-31 17:42:14  No: 60138

参考文献って、何のドコを読んだのかしら…


通りすがり  2006-01-18 07:08:07  No: 60139

もう解決してかなり時間が経ってますけど、
これって要素の「中身」の交換じゃなくて、「位置」の交換がしたかったのでは。
要素が大きい場合、リストの繋ぎ替えの方が安く付くから云々……
と思ったけど初心者と自称してるからそういうわけでもないのかな。


επιστημη  2006-01-19 00:28:03  No: 60140

> これって要素の「中身」の交換じゃなくて、「位置」の交換がしたかったのでは。

だとするとかなり面倒。std::listにはlinkの付け替えができるメソッドは限定されています。
spliceか何かでできるだろうけど。
高速交換を希望するなら list<int*> にするが吉。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加