とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

reverse_iterator, const_reverse_iterator, base

STL―標準テンプレートライブラリによるC++プログラミング 第2版
関係ないけど std::ostream_iterator は #include が必要。今まで省略して間違ってた。もちろん本の方も間違ってる。
reverse_iterator の base は実際の一つ後ろを指しているから,(通常の)iterator と混ぜるときは -1 が必要。

// P199 ex10-02.cpp
#include<iostream>
#include<string>
#include<vector>
#include<iterator>
#include<algorithm>
int main(){
 using std::cout;
 using std::string;
 using std::vector;
 using std::ostream_iterator;
 using std::copy;
 using std::find;
 using std::endl;
 cout << "Using find with normal and reverse iteration:\n";
 ostream_iterator<char> o(cout, " ");
 const string s("now is the time");
 const vector<char> v(s.begin(), s.end());
 cout << "chars from the first t to the end: ";
 copy(find(v.begin(), v.end(), 't'), v.end(), o); cout << endl;

 cout << "chars from the last t to the end: ";
 vector<char>::const_reverse_iterator r = find(v.rbegin(), v.rend(), 't');
 copy(r, v.rend(), o); cout << endl;

 cout << "chars from the last t to the end: ";
 copy(r.base() - 1, v.end(), o); cout << endl;
}

出力:

Using find with normal and reverse iteration:
chars from the first t to the end: t h e   t i m e
chars from the last t to the end: t   e h t   s i   w o n
chars from the last t to the end: t i m e