[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
お久しぶりです。暴走特急トーマスです。
最近は毎朝、放送しているコナンと金田一を見るのが日課です!
金田一って、舞台がすごくおおがかりなんですよね。
だから登場人物が半分くらい〇されて、なかなかえげつないんですよ…。
そう考えるとある意味、コナンもすごいですよね。
米花町にはすみたくないです(笑)
さて、それでは前回言った通り、vectorについて説明します。
vectorは動的配列です。
つまり要素数を任意で拡張させることができます。
main1.cpp-------------------------------------------------------
#include<iostream>
#include<vector>
int main(){
std::vector<int> vect; // インスタンス化。<>の中で型を指定する。
//データ挿入
for( int i = 0; i < 5; i++ ){
vect.push_back(i); //vectorの中に要素を挿入する
}
//実行結果表示
for( int i = 0; i < 5; i++ ){
std::cout << vect[i] << " ";
}
}
実行結果------------------------------------------------------------
0 1 2 3 4
--------------------------------------------------------------------
こんな感じです。push_backすることで、要素を増やしていってます。
また、
std::vector<int> vect(5);
インスタンス化時に領域を確保しておくこともできます。
上の場合は5個確保できていますね。
次にvectorのメンバ関数を説明します(vector以外のコンテナでも使用するものがあります)。
-------------------------------------------------------------------------------------------
push_back()・・・先頭に要素を挿入
pop_back()・・・末尾の要素を削除
reserve()・・・引数分の領域を確保(引数より少し多めに確保しているらしい)
clear()・・・要素を全削除
size()・・・要素数を戻り値として返す
capacity()・・・保持できる要素数を返す
empty()・・・中に要素があるか、無いか調べて戻り値を返す
erase()・・・指定した要素を削除する
--------------------------------------------------------------------------------------------
これらが主なメンバ関数です。これだけあると動かせそうですよね!
また、vectorやlistには効率的にアクセスできる仕組みとしてiteratorというものが用意されています。
iteratorとは、STLのデータ構造専用のポインタのようなものです。
それでは、main1の実行結果を表示させるプログラムをiteratorを使って表現します。
実行結果表示-------------------------------------------------------------------
{
std::vector<int>::iterator it = vect.begin(); //iteratorのインスタンス化。
while( it != vect.end() ){
std::cout << *it << " ";
it++;
}
}
-------------------------------------------------------------------------------------
iteratorはインスタンス化時に、操作したいコンテナのbegin()関数で初期化します。
begin()関数の戻り値は、コンテナの先頭の要素を指します。
同様にend()関数は末尾の1つ後ろの要素返します。
ちなみに、自作クラスをvectorの中に入れた場合、iteratorとアロー演算子を組み合わせることでメンバ変数、関数にアクセスすることができます。
最後にerase()関数の使い方を説明します。
erase()は、iteratorが指定した要素を削除します。
注意するべき点としては、erase()を使うと削除した要素以降のiteratorを無効してしまいます。
また、削除しても領域は縮小できません。
縮小させるには、swap関数を使います。
ソースを組んでみます。
----------------------------------------------------------------
{
std::vector<int> vect;
//データ挿入
for( int i = 0; i < 5; i++ ){
vect.push_back(i);
}
std::cout << "領域の要素数:" << vect.size()
<< std::endl;
std::cout << "領域の領域:" << vect.capacity() << std::endl;
}
実行結果--------------------------------------------------------
領域の要素数:5
領域の領域:6
要素を一つ削除=============
領域の要素数:4
領域の領域:6
swapで切り詰め=============
領域の要素数:4
領域の領域:4
---------------------------------------------------------------------
以上でvectorの説明は終わりです。
特徴をまとめると
①一時的な領域確保に向いている
②delete不要
③要素数と確保している領域を切り離して理解する必要がある
こんな感じです。
かなり雑な説明だったので、不備があったらごめんなさい・・・。
STLは、大体扱い方が似ているので基本さえ覚えればバッチリです!
また、boostにもコンテナとイテレータがありますから、boostを勉強する際に足がかりになるかもしれませんね。
というわけでvector編終了です。
COMMENT