C++のstd::vectorとstd::arrayの違いとは?特徴と使い分けを徹底解説
C++には、複数の値をまとめて管理できるコンテナとして std::vector と std::array が用意されています。一見似ていますが、内部構造や動作には重要な違いがあり、それぞれ得意な場面が異なります。この記事では、両者の主な違い、宣言と初期化の基本構文、そして実際に動作するサンプルコードを交えながら、わかりやすく解説します。
std::vectorとstd::arrayの主な違い
| 比較項目 | std::vector | std::array |
|---|---|---|
| サイズ | 動的(要素の追加で自動拡張) | 固定(宣言時に決定) |
| メモリ消費 | やや多い | 少ない(効率的) |
| 要素アクセス | 高速だが僅かなオーバーヘッドあり | 常に一定時間(O(1)) |
| 必要なヘッダ | <vector> | <array> |
- vector は要素を格納するためのシーケンシャルコンテナであり、インデックスベースではありません。
- array は同じ型の要素を固定サイズで順に格納するコレクションで、インデックスベースです。
- vector は動的な性質を持つため、要素を挿入するとサイズが自動的に拡張されます。
- array は固定サイズのため、一度初期化した後はサイズを変更できません。
- vector は内部管理用の情報を保持するため、より多くのメモリを占有します。
- array はメモリ効率に優れたデータ構造です。
- vector は要素へのアクセスに比較的多くの時間を要することがあります。
- array は要素が連続したメモリ領域に配置されるため、位置にかかわらず一定時間でアクセスできます。
宣言と初期化の構文
vector と array は、それぞれ次のような構文で宣言・初期化できます。
// vector の宣言
vector<datatype> vec_name;
// array の宣言
type array_name[array_size];
// vector の初期化
vector<datatype> vec_name = {values};
// array の初期化
datatype array_name[array_size] = {values};
std::vector のサンプルコード
以下は、2次元の vector を作成して全要素を表示する例です。vector は可変長なので、行ごとに要素数が異なるデータでもそのまま扱える点が大きな特徴です。
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 2次元vectorの宣言と初期化
vector<vector<int>> v{ { 4, 5, 3 }, { 2, 7, 6 }, { 3, 2, 1, 10 } };
cout << "the 2D vector is:" << endl;
// 全要素を走査して出力
for (int i = 0; i < v.size(); i++) {
for (int j = 0; j < v[i].size(); j++)
cout << v[i][j] << " ";
cout << endl;
}
return 0;
}
実行結果
the 2D vector is: 4 5 3 2 7 6 3 2 1 10
std::array のサンプルコード
次に、std::array を使った例です。size() や max_size()、at()、fill() など、std::array が提供する代表的なメンバ関数の使い方を確認できます。
#include <iostream>
#include <array>
using namespace std;
int main() {
// サイズ4のarrayを宣言・初期化
array<int,4> a = {10, 20, 30, 40};
cout << "The size of array is : ";
// size() で要素数を取得
cout << a.size() << endl;
cout << "Maximum number of elements array can hold is : ";
// 格納可能な最大要素数
cout << a.max_size() << endl;
cout << "The array elements are (using at()) : ";
// at() を使って各要素を表示
for (int i = 0; i < 4; i++)
cout << a.at(i) << " ";
cout << endl;
// 全要素を1で埋める
a.fill(1);
cout << "Array after filling operation is : ";
// fill() 後の配列を表示
for (int i = 0; i < 4; i++)
cout << a[i] << " ";
return 0;
}
実行結果
The size of array is : 4 Maximum number of elements array can hold is : 4 The array elements are (using at()) : 10 20 30 40 Array after filling operation is : 1 1 1 1
まとめ:使い分けのポイント
std::vector と std::array は、それぞれ次のような場面で活躍します。
- std::array が向いているケース:要素数があらかじめ決まっていて変更不要な場合や、メモリ効率・アクセス速度を重視したい場合。
- std::vector が向いているケース:実行時に要素数が増減する可能性がある場合や、柔軟に要素を追加・削除したい場合。
サイズの固定性・メモリ効率・アクセス性能といった観点から両者を比較し、プログラムの要件に合ったコンテナを選択することで、より安全で効率的なC++プログラムを実現できます。
-
C++の比較演算子(==)とstd::string::compare()の違いを徹底解説
C++の比較演算子(==)とstd::string::compare()の違いとは? C++で文字列を比較する方法として、比較演算子 == と std::string::compare() の2つがあります。結論から言うと、この2つの違いは戻り値だけです。実際、string::operator==() は内部的に string::compare() を呼び出して実装されています。 戻り値の違い 比較演算子(==)は、2つの文字列が等しいかどうかを示す bool 型の値(true / false)を返します。一方、compare() は、2つの文字列が互いにどのような関係にあるかを示す int
-
C++におけるendlと\nの違いとは?パフォーマンスを意識した使い分けのポイント
C++の改行出力:endlと\nの基本的な違い C++で標準出力に改行を出力する方法として、主に「\\n」と「std::endl」の2つが使われます。一見どちらも同じように見えますが、内部動作には重要な違いがあります。 \\n の特徴 \\nは単純に改行文字を出力します。この際、改行コードはプラットフォーム固有の表現に変換されます。たとえばWindows環境では、自動的に「\\r\\n(キャリッジリターン+ラインフィード)」として扱われます。 std::endl の特徴 std::endlも同様に改行を出力しますが、それに加えてストリームのフラッシュ(バッファの強制書き出し)を行う点が異なりま