• ベストアンサー

listでもっぱら通常iteratorを

使っていますが逆イタレータを使ったほうがいいような例などはあるのでしょうか? end()は最後の要素の次の要素を指してくれるので正イタレータでだいぶ助かっていますが 逆イタレータはrbegin()が最初の要素の一つ前の要素を指してくれないのでメリットがないように思われます

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

  • ベストアンサー
  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.3

> insert(rp,"a"); > はエラーになりますが > これに代わる逆イタレータ用の関数はあるのでしょうか? insert(rp.base(), "a"); のようにbaseを使って通常のiteratorに変換すればinsertに渡せます。 (例) list<string> lstr; lstr.push_back("1"); lstr.push_back("2"); lstr.push_back("3"); list<string>::reverse_iterator rp; rp = std::find(lstr.rbegin(), lstr.rend(), "2"); // 逆方向から見て"2"の直前(つまり"2"と"3"の間)に"a"を挿入する lstr.insert(rp.base(), "a"); // lstrの要素を先頭から順番に表示する for (list<string>::iterator p = lstr.begin(); p != lstr.end(); ++p) {   cout << *p << endl; } (実行結果) 3 a 2 1

keyguy
質問者

お礼

ありがとうございます よく分かりました

その他の回答 (2)

  • MASATO3
  • ベストアンサー率60% (27/45)
回答No.2

逆iteratorの普通の役割は逆方向(最後尾から先頭方向)の順次処理です。 色々と使い道はあると思います。 (例1) // 後ろの要素から順番に表示 list<string> lstr; lstr.push_back("1"); lstr.push_back("2"); lstr.push_back("3"); list<string>::reverse_iterator rp; for (rp = lstr.rbegin(); rp != lstr.rend(); ++rp) {   cout << *rp << endl; } (例2) // "2"と一致する要素以前を全て消去する list<string> lstr; lstr.push_back("1"); lstr.push_back("2"); lstr.push_back("3"); rp = find(lstr.rbegin(), lstr.rend(), "2"); if (rp != lstr.rend()) {   lstr.erase(lstr.begin(), rp.base()); }

keyguy
質問者

補足

ありがとうございます 基本的に勘違いしていました rbegin()が最後の要素で rend()が最初の要素の一つ前の要素ですね そうなるとreverse()を使うと時間を損しますから使い勝手がいいですね ところで insert(rp,"a"); はエラーになりますが これに代わる逆イタレータ用の関数はあるのでしょうか? これら関数は逆イタレータ用には用意されていないのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ええと.... 「逆イテレータは rbegin() が最初の要素の一つ前の要素を指してくれない」 とは, どのような意味でしょうか? 空リストでなければそんなことは当然ありませんよね?

keyguy
質問者

お礼

訂正します list<string> lstr; list<string>::iterator p; string str; list<string>::reverse_iterator rp; として lstr.push_back("1"); lstr.push_back("2"); lstr.push_back("3"); rp=lstr.rbegin(); lstr.insert(rp,"a");//compile error としようとしたらコンパイルでエラーになりました 逆イタレータはインサート関数も利用できないのですね これはもう利用価値はないですね?

keyguy
質問者

補足

ありがとうございます 確かめるために list<string> str; list<string>::iterator p; string str; list<string>::reverse_iterator rp; として lstr.push_back("1"); lstr.push_back("2"); lstr.push_back("3"); rp=lstr.rbegin(); lstr.insert(rp,"a");//compile error としようとしたらコンパイルでエラーになりました 逆イタレータはインサート関数も利用できないのですね これはもう利用価値はないですね?

関連するQ&A