- ベストアンサー
イテレータの要素を交換したい。
こんにちは。 C++で、STLを使わず、イテレータの要素を交換したいのですが、中々いい方法が浮かびません。 イテレータの要素で、 A、B、C、D が並んでいるとして、D、B、C、A、順に実行したいのです。 (この要素は関数です) AのポインタとDのポインタを入れ替えればいいと思ってやったんですが、結果的には変化ありませんでした。 どうやったら要素だけを交換して、実行順をD、B、C、Aにできるんでしょうか? STLのitr_swapを使わずにお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
よくわかんないけど、こーゆーことかしら。 #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; }
その他の回答 (3)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
#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; }
お礼
確かに順番だけが変わっています。 イテレータ(循環リスト)の順番を変えたいのですがこれでいけるかもしれません。 ダブルポインタで交換してもイテレータの順番も変わるのだから意味がないと思っていたのですが、まだよくわかりませんが可能なようですね。 回答ありがとうございます。
補足
イテレータの交換についてまた新しい質問で伺おうと思います。 いったんこの質問は締め切らせていただきます。 ありがとうございました。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> #include <array> > が使えません。 vectorでも[]でもいいから。
補足
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は使いこなせないので全くわかりません ( 人 ) その変もどうかご教授お願いします。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
「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; }
お礼
イテレータ内の順番は確かに変わるんですが、それだと要素の中身も変わらないでしょうか? 例えば、順番がA 1、D 100だとすると、Aの値が1で、Dの値が100 ポインタの交換でA、100 D、1になり、イテレータ内の順番も変わるのでD Aになります。 そうすると結果的に順番は1、100になりませんか?
補足
自分は、イテレータ自体が参考書に載っている自作なので、自分で要素を交換することにしたのですが、以下のメソッドでやると void swapptr(void ** first, void ** second) { void *temp = *first; *first = *second; *second = temp; } ポインタですから中身が交換され、イテレータによって順番が交換されるのですから結果的に変わりませんでした。
補足
すみませんが #include <array> が使えません。 ’array’:No such file or directoryとエラーがでます。 自分の開発環境は VS.NET 2003 です。