見出し画像

C++ 再入門 その28 - vector 再び

ちょっとイテレータの話を挟みましたが、あらためて vector です。

C++ 再入門 その26 - STLコンテナ(1)vector

vector は配列のようなコンテナで要素にあたるオブジェクトをメモリ上の連続した領域に確保します。配列と異なるのはそのサイズを動的に変更できることです。では基本的な使い方から見ていきましょう。

まずヘッダをインクルードします。ヘッダ名は <vector>です。変数の宣言は要素となる型をテンプレートの”<>”に囲って宣言します(いつものように std は省略して書きます)。

#include <vector>
using namespace std;
…
vector<int> v;

これだけだと中身が空(ひとつも要素を持たない)の vector が作られます。特定の大きさの vector を宣言したい場合には変数名に続いて”()”内に要素の数を書きます。通常の配列宣言に似ていますし、この変数には”[]”を使って読み書きできるようになります。

vector<int> v(3);
v[0] = 1;
v{1] = 2;
…

初期値を与える書き方も出来ます。

vector<int> v = { 1, 2, 3, 4, 5 };

全ての要素に同じ初期値を設定するのであれば、”()”の2番目の値で指定します。

vevtor<int> v(3, 1);
cout << v[2] << endl;
…

他にも宣言時に出来ることはあるのですが、とりあえずここまでで足りるでしょう。vectorは後から大きさを変えることが出来るので、最初の宣言のように中身が空であっても要素を追加していくことが出来ます。最後に追加するときには push_back() を使います。

v.push_back(5);

これで元々 v は要素数3で宣言していたので、v[3] に 5 が入れられ、v の大きさは 4 となります。もちろん任意の位置に要素を挿入することもできます。

v.insert(v.begin(), 0);

insertの最初の引き数には挿入する位置のイテレータを書きます(添字を書いては駄目です)。ここでは最初の要素になっています。2番目の引き数に挿入した要素に入れる値を指定します。

このように要素をどんどん追加できるので、その大きさがわからなくなることもシバシバです。でも「安心してください」、そのためのメソッドも用意されています。

v.size() //ちなみに戻り値の型は size_type

もちろん、要素を削除する方法もあり、手軽なのは末尾の要素を削除する pop_back() があります。なおこのメソッドの戻り値は無いので、削除した値が必要な時は前もって他の手段で取得する必要があります。そして erase() を使えば任意の要素を削除できます(使い方はちょっとだけ難しい)。また全ての要素を削除して空の vector にするのであれば clear() です。

もちろん vector は int のような単純な型だけではなく構造体やクラスであっても構いません。vector は新しい要素を追加する時には、それぞれの要素に対してコンストラクタを呼び出し、削除するときにはデストラクタを呼び出します。コンストラクタに引き数が必要なケース(デフォルト・コンストラクタ以外を使う時)では、どのように指定するかは少しばかり面倒です。

  • 同じ値で初期化する時

vector<Class> v(3, Class(10)); // それぞれの要素をClass(10)で初期化
  • 初期化子リストを使う

vector<Class> v{Class(1), Class(2), Class(3)}; // 要素ごとにコンストラクタを明示して初期化
  • push_backでひとつずつ要素を追加する

vector<Class> v;
v.push_pack(Class(1));
v.push_back(Class(2));
v.push_back(Class(3));

これだけのことが出来れば、もう配列を使う必要もないでしょう。vector で賄えるはずです。配列と比べるとわずかに大きさなどを管理する領域は増えますが、基本的には配列と同じように使えます。

C++ vector操作について

[C++/STL] std::vectorクラスの使い方

C++のvectorを復習する - 画像の利用をありがとうございます

vector は、どの要素もアクセスするのに同じ時間(手間)しかかかりませんし、大きさを増やすのにも(要素を追加)殆どの場合は一定の時間しかかかりません(こういう書き方をしているということは「そうではない」ことがあるわけです)。但し途中に要素を追加したり、末尾以外の要素を削除すると比較的時間のかかることになります。この辺りを理解するには vector の仕組みをもう少し知る必要が出てきます。次回はそのへんからにしましょう。

ヘッダ画像は、以下のものを使わせていただきました。https://commons.wikimedia.org/wiki/File:ISO_C%2B%2B_Logo.svg
Jeremy Kratz - https://github.com/isocpp/logos , パブリック・ドメイン,
https://commons.wikimedia.org/w/index.php?curid=62851110による

#プログラミング #プログラミング言語 #プログラミング講座 #CPP #STL #vector #初期化 #コンストラクタ #push_back #insert #size  

いいなと思ったら応援しよう!

kzn
頂いたチップは記事を書くための資料を揃えるために使わせていただきます!