C/C++

C++のvector

投稿日:2018年6月9日 更新日:

vector

  • push_backで登録する変数はヒープ領域に確保される。vector変数の解放で、登録された変数もヒープ領域から解放される。
  • vectorは、デストラクタが呼び出されると、メモリの解放が行われる。スコープを抜ける時、解体の直前で自動的に呼び出される。スコープの中の処理中に要素を削除しても、内部の領域が縮小する事はないが、swap技法を使えば、強制的に領域を切り詰めることは可能。std::vector<int>().swap(v);
  • データが大きめのクラスをvectorに格納する場合、インスタンスをvectorに格納していくと、メモリを確保しなおす場合や、push_backの際にコピーするのに時間がかかっていまう。そこで、インスタンスではなくpointerをvectorに格納しておく方法が良いが、vectorが解放される前に登録したオブジェクトを解放する必要がある。emplace_backを使用することで改善できが、C++11からの機能。
  • イテレータは容易に無効化されます。要素の追加はreserveしていなかった場合にイテレータが壊れる可能性があります。なので、基本的に追加した場合にイテレータが壊れると考えた方が安全です。
  • 要素の追加の際のコンストラクトコストを考えるとemplace_backを使うべきです。
  • NRVOとかmove semanticsがあるので、現代のまともなコンパイラでは参照やポインタを経由せずに返してもコストがありません。move semanticsはC++11から。

 

 

 

 

 

スポンサーリンク

スポンサーリンク

-C/C++

執筆者:

関連記事

C言語その他

グローバル変数のstatic属性 グローバル変数にstaticを付けた時のstaticは「静的」という意味ではなく、スコープが「宣言位置からそのコンパイル単位の終わりまで」となる。 第10回目 4大メ ...

C++のクラス

メンバ変数   メンバ変数がクラスの場合の初期化 クラスのメンバ変数が引数付きのコンストラクタの場合、メンバイニシャライザを使ってコンストラクタを呼び出す。 クラスのメンバ変数の引数付きのコ ...

C++のTIPS

・それ、ポインタ使わなくてもできるよ:C言語のポインタとC++の流儀 ・【C言語/C++】 配列は戻り値にできない【配列を適切に返す方法】    

ポインタ

  ポインタ int* a 変数 a の中身はアドレスを示す。 ポインタ変数 *a はアドレス(aの値)のメモリの値をポインタ変数(*a)として扱う事ができる。 *a=1; はaの値(アドレ ...

C++の参照

参照変数 参照の宣言 : 「 参照先の型&  参照変数名 = 参照先の変数; 」 参照変数は宣言と同時に代入する必要がある。初期化で必ず参照先の変数を指定する必要がある。参照とは「他の変数を指 ...