前ページへ :
トップへ :
次ページへ
次のサンプルは、データを追加した後、削除していくサンプルです。このサンプルのように
データの追加、削除を行う用途にはvectorは不向きですが、サンプルですので、深く考えないで
ください。
#include <iostream>
// vectorを使えるようにする
#include<vector>
using namespace std;
// 長さ10のchar型vectorを作る
vector<char> vect(10);
//
// vectorの中身を表示する
void disp(){
cout << "vector ";
for( int i = 0 ; i < vect.size() ; i++ )
cout << vect.at( i );
cout << endl;
}
int main(int argc, char* argv[]){
int i;
// vectorに文字を代入する
// 今回は、あらかじめ10個分のvectorを用意し、それに代入する
// あらかじめ代入するデータの個数がわかっている場合は、先ほどの例より、
// こちらの方が効率が良い。なぜならば、データ追加(push_back)の度に、
// vectorの領域を確保しなおす必要がなくなるから。
for( i = 0 ; i < 10 ; i++ )
vect.at( i ) = 'A'+i;
// vectorの中身を表示
disp();
// vectorが空でなければ、削除して内容を表示する
while( !vect.empty() ){
vect.pop_back();
disp();
}
return 0;
}
|
vector ABCDEFGHIJ
vector ABCDEFGHI
vector ABCDEFGH
vector ABCDEFG
vector ABCDEF
vector ABCDE
vector ABCD
vector ABC
vector AB
vector A
vector
|
前回のサンプルと今回のサンプルの異なる点は、vectorを定義する場合に、あらかじめ10個の
領域を確保しているところです。前回のサンプルでは「push_back」を10回実行しているため、
vectorクラスの中では、プログラマーの知らないあいだに、push_backを実行する度に、新しく
メモリーを割り当てて、新しいメモリーに古いデータ群をコピーし、新しく追加するデータを
コピーするという作業が行われています。したがって、10回push_backを行うということは、
とても効率が悪いのです。
それに対して、今回のようにあらかじめ10個分の領域を確保しておけば、代入するだけですので
新しくメモリー領域を確保し、コピーをするという作業がなくなり効率が良くなります。
今回のサンプルでは、vectorの末尾から1つずつデータを消去しています。これをvectorが
空になるまで(empty()関数を使用)繰り返しています。
このpop_back関数も、vectorの領域の大きさが変更されますので、新たな領域を確保し、
古いデータ群をコピーするという作業が行われ、効率が悪くなります。一度に複数のデータを
削除する場合は、「erase」関数を使う方が効率が良くなります。また、すべてを削除するので
あれば、clear関数を使用します。
erase関数の引数にイタレーターを使用しますので、次にすべてを削除する例を紹介します。
#include <iostream>
// vectorを使えるようにする
#include<vector>
using namespace std;
// 長さ10のchar型vectorを作る
vector<char> vect(10);
//
// vectorの中身を表示する
void disp(){
cout << "vector ";
for( int i = 0 ; i < vect.size() ; i++ )
cout << vect.at( i );
cout << endl;
}
int main(int argc, char* argv[]){
int i;
// vectorに文字を代入する
for( i = 0 ; i < 10 ; i++ )
vect.at( i ) = 'A'+i;
// vectorの中身を表示
disp();
// vectorが空でなければ、すべてを削除して内容を表示する
while( !vect.empty() ){
vect.clear();
disp();
}
return 0;
}
|
vector ABCDEFGHIJ
vector
|
前ページへ :
トップへ :
次ページへ
|