format_list_bulleted
【C++】C++で可変長配列を扱うための動的配列クラス(std::vector)について解説
最終更新日時:2022-06-07 04:56:22



本記事では普通の配列をより便利に拡張し、可変長配列を簡単に扱うことの出来る、C++の動的配列クラス(std::vector)に解説します。

std::vectorとは?

std::vectorとは配列の長さを自由に変更することができるクラスです。普通の配列だとはじめに配列のサイズを指定しなければいけなく、後から配列のサイズを変えることはできない。例えば、int a[10]と配列の大きさもはじめに宣言しなければいけなく、後から配列のサイズの大きさを変更することもできません。しかし、std::vectorを用いることでそれらを可能にすることができます。また、配列要素数を参照できたりなど、普通の配列と比べて非常に便利です。

std::vectorの使い方(includeから配列の宣言まで)

インクルード~vectorの宣言

std::vectorを使うために以下のようにインクルードする必要があります。また本記事では、std::vectorからvectorと記述するためにするため名前空間stdを指定しています。またvectorを宣言するときはvector<型名> 変数名として宣言します。このときあらかじめ配列の大きさを指定する場合はvector<型名> 変数名(サイズ)のように記述します。さらに、配列の中の値を指定した値に初期化する場合は、vector<型名> 変数名(サイズ,初期化したい値)のように記述します。

#include <vector>
using namespace std;//名前空間を指定
int main() {
    vector<int> x;//名前空間を指定してないならstd::vector<int> x;
    vector<int> x(3);
    vector<double> x(3,3.14);
}

二次元配列の宣言

vectorを用いて二次元配列を宣言する場合はvector<vector<型名>> 変数名(サイズ,初期化したい値)と記述します。最後の行のvector<vector<int>> xy(3, vector<string>(3, "abc"));は以下の表のように3×3の行列で「abc」という文字が全て、格納されています。

vector<vector<string>> xy;
vector<vector<string>> xy(3);
vector<vector<string>> xy(3, vector<string>(3));
vector<vector<string>> xy(3, vector<string>(3, "abc"));
int012
0abcabc
abc
1abc
abc
abc
2abc
abc
abc

std::vectorの使い方(配列の処理)

値の参照&代入

値の参照や代入に関してはvectorの宣言ができれば、あとは普通の配列処理と同じやり方でできます。

タイトル:vector1.cpp

#include<iostream>
#include<string>
#include <vector> 
using namespace std;
 
int main() {
   vector<vector<string>> xy(3, vector<string>(3,"abc"));
   cout<< xy[1][1]<< endl;
   xy[1][1]="def";
   cout<< xy[1][1]<< endl; 
   return 0;
}

タイトル:出力

abc
def

要素数の参照&変更

vectorの要素数を参照する場合、変数名.size()とすることで参照することができます。二次元配列の場合変数名.size()で行の数、変数名[0].size()で列の数を取得することができます。また、変数.resize(変更したい要素数)とすることで、配列の要素数を変更することもできます。

タイトル:vector1.cpp

#include<iostream>
#include<string>
#include <vector> 
using namespace std;
 
int main() {
    vector<string> x(3, "abc");//1*3
    vector<vector<string>> xy(4, vector<string>(3,"abc"));//4*3

    cout << x.size() << endl; //3
    x.resize(5);//5に変更
    cout << x.size() << endl; //5

    cout<< xy.size()<< endl; //4
    cout<< xy[1].size()<< endl;//3

    xy.resize(5); //5*5に変更
    for(int i=0; i<5; i++){
        xy[i].resize(5);
    }
    cout<< xy.size() << endl; //5
    cout<< xy[0].size() << endl; //5
    
    return 0;
}

タイトル:出力

3
5
4
3
5
5

配列の末尾に要素を追加する

vectorのpush_back()を用いることで配列の末尾に要素を追加することもできます。例えばx.push_back(3)とすることで、xという配列の末尾に3という数字を追加されます。

タイトル:pushback1.cpp

#include<iostream>
#include<string>
#include <vector> 
using namespace std;
 
int main() {
    vector<string> x(3, "abc");//1*3
    x.push_back("def");
    for(int i=0;i<x.size();i++){
        cout << x[i] << endl;
    }
    return 0;
}

タイトル:出力

abc
abc
def

また2次元配列における末尾への要素の追加は以下のように記述します。

タイトル:pushback2.cpp

#include<iostream>
#include<string>
#include <vector> 
using namespace std;
 
int main() {
    vector<vector<string>> xy(3, vector<string>(3,"abc"));//3*3
    
    xy[0].push_back("def");
    for(int i=0;i<xy.size();i++){
        for(int j=0;j<xy[i].size();j++){
            cout << xy[i][j]<< " ";
        }
       cout << endl;
    }
    return 0;
}

タイトル:出力

abc abc abc def 
abc abc abc 
abc abc abc 

要素の削除

vectorでは変数名.erase(指定位置)を用いることで指定した場所の要素を削除することができます。

タイトル:erase.cpp

#include<iostream>
#include<string>
#include <vector> 
using namespace std;
 
int main() {
    
    vector<string> x={"abc","def","ghi"};//1*3

    x.erase(x.begin()+1);//先頭から+1番目
    for(int i=0;i<x.size();i++){
        cout << x[i] << " ";
    }
    cout << endl;
    x.erase(x.end()-1);//末尾
    for(int i=0;i<x.size();i++){
        cout << x[i] << " ";
    }
    cout << endl;
    return 0;
}

タイトル:出力

abc ghi 
abc 

まとめ

本記事ではstd::vectorの使い方について紹介しました。では要点をまとめます。

  • std::vectorとは普通の配列をより便利に拡張したC++の動的配列クラス
  • 宣言してしまえば普通の配列として扱うことができる
  • 配列の要素数の参照・変更が可能
  • 配列の末尾に要素の追加が可能
  • 指定した位置の要素の削除が可能

ぜひ、普通の配列をより便利に拡張したC++のstd::vectorを使ってみてください