- ベストアンサー
listでもっぱら通常iteratorを
使っていますが逆イタレータを使ったほうがいいような例などはあるのでしょうか? end()は最後の要素の次の要素を指してくれるので正イタレータでだいぶ助かっていますが 逆イタレータはrbegin()が最初の要素の一つ前の要素を指してくれないのでメリットがないように思われます
- みんなの回答 (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
その他の回答 (2)
- MASATO3
- ベストアンサー率60% (27/45)
逆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()); }
補足
ありがとうございます 基本的に勘違いしていました rbegin()が最後の要素で rend()が最初の要素の一つ前の要素ですね そうなるとreverse()を使うと時間を損しますから使い勝手がいいですね ところで insert(rp,"a"); はエラーになりますが これに代わる逆イタレータ用の関数はあるのでしょうか? これら関数は逆イタレータ用には用意されていないのでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
ええと.... 「逆イテレータは rbegin() が最初の要素の一つ前の要素を指してくれない」 とは, どのような意味でしょうか? 空リストでなければそんなことは当然ありませんよね?
お礼
訂正します 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 としようとしたらコンパイルでエラーになりました 逆イタレータはインサート関数も利用できないのですね これはもう利用価値はないですね?
補足
ありがとうございます 確かめるために 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 としようとしたらコンパイルでエラーになりました 逆イタレータはインサート関数も利用できないのですね これはもう利用価値はないですね?
お礼
ありがとうございます よく分かりました