• ベストアンサー

イテレータの要素を交換したい。

 こんにちは。 C++で、STLを使わず、イテレータの要素を交換したいのですが、中々いい方法が浮かびません。 イテレータの要素で、  A、B、C、D が並んでいるとして、D、B、C、A、順に実行したいのです。 (この要素は関数です) AのポインタとDのポインタを入れ替えればいいと思ってやったんですが、結果的には変化ありませんでした。 どうやったら要素だけを交換して、実行順をD、B、C、Aにできるんでしょうか? STLのitr_swapを使わずにお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

よくわかんないけど、こーゆーことかしら。 #include <iostream> #include <array> #include <algorithm> using namespace std; int main() { array<char,4> data = { 'A', 'B', 'C', 'D' }; array<char*,4> ptr = { &data[0], &data[1], &data[2], &data[3] }; array<char*,4>::iterator first = ptr.begin(); array<char*,4>::iterator last = ptr.end(); --last; iter_swap(first,last); for_each(data.begin(),data.end(),[](char c){cout << c << ' ';}); cout << endl; for_each(ptr.begin(),ptr.end(),[](char* p){cout << *p << ' ';}); cout << endl; }

DEADSPACE566
質問者

補足

すみませんが #include <array> が使えません。 ’array’:No such file or directoryとエラーがでます。 自分の開発環境は VS.NET 2003 です。

その他の回答 (3)

回答No.4

#include <iostream> #include <algorithm> using namespace std; int main() { char data[] = { 'A', 'B', 'C', 'D' }; char* ptr[] = { &data[0], &data[1], &data[2], &data[3] }; char** first = ptr; char** last = ptr+4; --last; iter_swap(first,last); for ( int i = 0; i < 4; ++i ) cout << data[i] << ' '; cout << endl; for ( int i = 0; i < 4; ++i ) cout << *ptr[i] << ' '; cout << endl; }

DEADSPACE566
質問者

お礼

確かに順番だけが変わっています。 イテレータ(循環リスト)の順番を変えたいのですがこれでいけるかもしれません。 ダブルポインタで交換してもイテレータの順番も変わるのだから意味がないと思っていたのですが、まだよくわかりませんが可能なようですね。  回答ありがとうございます。

DEADSPACE566
質問者

補足

イテレータの交換についてまた新しい質問で伺おうと思います。 いったんこの質問は締め切らせていただきます。 ありがとうございました。  

回答No.3

> #include <array> > が使えません。 vectorでも[]でもいいから。

DEADSPACE566
質問者

補足

array<char,4> data = { 'A', 'B', 'C', 'D' }; array<char*,4> ptr = { &data[0], &data[1], &data[2], &data[3] }; array<char*,4>::iterator first = ptr.begin(); array<char*,4>::iterator last = ptr.end(); --last; この記述のarrayをvectorに変えるんでしょうか? すいません。 自分にはSTLは使いこなせないので全くわかりません ( 人 ) その変もどうかご教授お願いします。 

回答No.1

「iter_swapとおなじことするには?」に答えればいいですか? template<typename Iter> void my_iter_swap(Iter first, Iter second) { std::iterator_traits<Iter>::value_type t = *first; *first = *second; *second = t; }

DEADSPACE566
質問者

お礼

 イテレータ内の順番は確かに変わるんですが、それだと要素の中身も変わらないでしょうか?  例えば、順番がA 1、D 100だとすると、Aの値が1で、Dの値が100 ポインタの交換でA、100 D、1になり、イテレータ内の順番も変わるのでD Aになります。 そうすると結果的に順番は1、100になりませんか?

DEADSPACE566
質問者

補足

 自分は、イテレータ自体が参考書に載っている自作なので、自分で要素を交換することにしたのですが、以下のメソッドでやると void swapptr(void ** first, void ** second) { void *temp = *first; *first = *second; *second = temp; } ポインタですから中身が交換され、イテレータによって順番が交換されるのですから結果的に変わりませんでした。

関連するQ&A

専門家に質問してみよう