忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

春休み毎日更新企画㊶

お久しぶりです。暴走特急トーマスです。

最近は毎朝、放送しているコナン金田一を見るのが日課です!

金田一って、舞台がすごくおおがかりなんですよね。
だから登場人物が半分くらい〇されて、なかなかえげつないんですよ…。

そう考えるとある意味、コナンもすごいですよね。
米花町にはすみたくないです(笑)

さて、それでは前回言った通り、vectorについて説明します。

vectorは動的配列です。
つまり要素数を任意で拡張させることができます。


拍手[1回]


ソースを組んでみましょう。

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;

 std::cout << "要素を一つ削除=============" << std::endl;
 
 std::vector<int>::iterator it = vect.begin();
 it = vect.erase(it);             //最初の要素を削除する
 
 std::cout << "領域の要素数:" << vect.size() << std::endl;
 std::cout << "領域の領域:" << vect.capacity() << std::endl;

 std::cout << "swapで切り詰め=============" << std::end;
 
std::vector<int>(vect).swap(vect);              //要素を切り詰め

 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編終了です。

PR

COMMENT

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]