C++には、同じ型の要素を順序を保って格納するための、さまざまなコンテナが用意されています。
サイズが固定されたコンテナにはstd::arrayがあり、動的にサイズを変更できるstd::vectorもあります。
配列やベクターを宣言するときは、そのコンテナが格納する要素の型を指定する必要があります。 配列の場合は、サイズも指定する必要があります。 2つのコンテナ型の初期化のしかたを、次の例で見てみましょう。
#include <array>
#include <string>
// std::array<element_type, size> variable_name {list of elements}
std::array<std::string, 3> indie_rock {"yeah", "yeah", "yeah"};
// indie_rock contains the elements "yeah" three times
ベクターは、さらに要素を追加できるようにメモリを確保するため、通常はより多くの領域を必要とします。 サイズを指定する必要はありません。
#include <vector>
// std::vector<element_type> variable_name {list of elements}
std::vector<int> countdown {3, 2, 1};
// my_vector contains the elements 3, 2 and 1
補足:テンプレートという仕組みの正確な中身を、今知っている必要はありません。テンプレートには、シラバスのツリーをもっと下ったところで、専用のコンセプトが用意されています。
ベクターと配列は、要素にアクセスするための関数を共通して備えています。
メンバー関数frontとbackを使うと、コンテナの最初と最後の要素を取得できます。
また、特定の要素にアクセスするには、atと[]演算子もあります。
countdown[0];
// => 3
countdown.at(2);
// => 1
countdown[1] = 4;
// countdown now contains 3, 4 and 1
indie_rock.back() = "yeahs";
// indie_rock is now "yeah", "yeah", "yeahs"
補足:コンテナの範囲外の位置を指定すると、
[]は未定義の動作を引き起こす可能性があります。at関数なら例外が発生するので、長い目で見ればそのほうが楽かもしれません。
vectorはサイズが固定ではないので、要素を追加したり削除したりできます。
そのためのよく使われる関数がemplace_backとpop_backです。
std::vector<std::string> witches {"Holly", "Alyssa", "Shannen"};
witches.pop_back();
// Shannen is no longer with the witches
witches.emplace_back("Rose");
// Rose has joined the team
コンテナが空かどうかは、メンバー関数emptyで確認できます。
要素の個数を知りたいときは、sizeを使います。