今回はコンテナをアルゴリズムを使って操作してみます。前回のプログラムと比べながらやってみましょう。
では、今回の要点です。
では、いってみましょう。
前回のプログラムで、for を使って vector の要素を 0 で埋めたり、1 で埋めたりしました。しかし、埋めるといえば第3章で使った fill アルゴリズムが用意されていました。どうにかして vector をアルゴリズムを使って操作したいのですが、どうすればよいのでしょうか?
先ず、vector は動的配列です。ということは中身は配列なので、&v.front() のように先頭ポインタを取得してアルゴリズムを適用してやれば何とかなりそうです。
しかし、実はvector が純粋な配列であるという保証はありません。vector の性質上それで問題ないように見えますが、それは仕様として定められていないのです。例えば、サイズが大きくなるとあるサイズで分断してメモリを確保するようになっていたとしても、誰も文句は言えないのです。
となると、第4章で話したイテレータを使わなければならないことになりますね。各コンテナに対するイテレータは既に用意されています。型名は <コンテナの型>::iterator で、始点のイテレータは begin メンバ関数で、終点 + 1 のイテレータは end メンバ関数で取得できます。
このことを踏まえて、前回のプログラムをアルゴリズムを使って書き直してみましょう。
| プログラム |
|---|
// Vector2.cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 配列のようなものを表示するアルゴリズム Disp
template <typename TYPE>
void Disp(TYPE pBegin, TYPE pEnd)
{
for(TYPE p = pBegin; p != pEnd; p++)
cout << *p << ' ';
cout << endl;
}
int main()
{
vector <int> vct(10);
fill(vct.begin(), vct.end(), 0);
Disp(vct.begin(), vct.end());
vct.resize(5);
fill(vct.begin(), vct.end(), 1);
Disp(vct.begin(), vct.end());
return 0;
} |
| 実行結果 |
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 |
このように、begin と end を使えばコンテナをアルゴリズムを使って操作することができるようになるのです。
また、逆順でアクセスするためのイテレータもあり、型名は <コンテナ名>::reverse_iterator 、取得関数は rbegin と rend です。
他にも、const オブジェクトの場合はイテレータも const ポインタっぽいものになっていて、const_iterator や const_reverse_iterator という型名になっています。
このようなイテレータは大体のコンテナに用意されています。他にも気を付けるべき細かい仕様はいくらかありますが、それはおいおい話したいと思います。
では、今回の要点です。
では、また次回まで。
Last update was done on 2001.8.2
この講座の著作権はロベールが保有しています