dポイントプレゼントキャンペーン実施中!

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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/10/29 10: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");
はエラーになりますが
これに代わる逆イタレータ用の関数はあるのでしょうか?
これら関数は逆イタレータ用には用意されていないのでしょうか?

補足日時:2004/10/29 02:18
    • good
    • 0

ええと....


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

この回答への補足

ありがとうございます
確かめるために
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
としようとしたらコンパイルでエラーになりました
逆イタレータはインサート関数も利用できないのですね
これはもう利用価値はないですね?

補足日時:2004/10/28 20:04
    • good
    • 0
この回答へのお礼

訂正します
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
としようとしたらコンパイルでエラーになりました
逆イタレータはインサート関数も利用できないのですね
これはもう利用価値はないですね?

お礼日時:2004/10/28 21:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!