[C++]std:vectorの使い方

C++で可変長配列を使用するにはSTLのstd::vectorを使用します。

この記事では、std::vectorの基本的な使い方を解説します。

準備

std::vectorを使うためには、vectorをincludeします。

C++
// std::vectorを使うために必要なファイル
#include <vector>

毎回std::vectorと記述するのが面倒な場合には、includeの後に以下の一文を記載することでstd名前空間を省略することができるようになります。

C++
using namespace std;

以降この記事では、std名前空間は省略して全てvectorで統一します。

変数宣言

vector型の変数を宣言する際には、以下のように書きます。

C++
// int型の可変長配列
vector<int> data;

この時、vectorの後の<>の間に挟んだ型の可変長配列となります。

コンストラクタにデータ数を渡すことで、データの初期サイズを設定することも可能です。

C++
// データ数10の可変長配列
vector<int> data1(10);
// データ数10、初期値5で初期化した可変長配列
vector<int> data2(10, 5);

データの追加、挿入

vector型変数にデータの追加、挿入を行う場合にはpush_back関数、insert関数を使用します。

データを末尾に追加する場合にはpush_back関数を、任意の位置にデータを挿入する場合にはinsert関数を使用します。

C++
// データを末尾に追加
data.push_back(10);
// 任意の位置にデータを挿入
data.insert(data.begin() + 1, 20);

データの挿入の場合には、begin関数で先頭位置を指定してそこから何番目のデータの前に挿入するか指定します。

データの削除

vector型変数からデータの削除を行う場合にはerase関数を使用します。

C++
// 任意の位置のデータを削除
data.erase(data.begin() + 1);

データの削除の場合もデータの挿入の場合と同様に、begin関数で先頭位置を指定してそこから何番目のデータを削除するか指定します。

また、全てのデータを一括削除する場合にはclear関数を使用します。

C++
// データの一括削除
data.clear();

データへアクセス

vector型変数のデータにアクセスする場合には、通常の配列と同じように[]を指定します。

C++
// 0番目のデータを取得
int a = data[0];
// 1番目のデータに10を設定
data[1] = 10;

また、vector型変数がconst型の場合にはat関数を使用して変数値の取得を行うことも可能です。

C++
// 2番目のデータを取得
int b = data.at(2);

先頭データと末尾データのみfront関数、back関数を使用して値の取得を行うことができます。

C++
// 先頭データを取得
int first = data.front();
// 末尾データを取得
int last = data.back();

forループ

vector型変数のデータのforループには、添字によるループ(通常の配列と同様)とイテレータによるループがあります。

C++
// 添字によるループ
for(int idx = 0; idx < (int)data.size(); idx++)
{
    // 処理(下例ではデータを2倍)
    data[idx] *= 2;
}
// イテレータによるループ
for(vector<int>::iterator itr = data.begin(); itr != data.end(); ++itr)
{
    // 処理(下例ではデータを2倍)
    *itr *= 2;
}

イテレータによるループでは、ループ変数がイテレータとなるため、実データにアクセスするためにはアスタリスクを先頭に付与します。

ちなみに、イテレータループ中に「今何番目か」が知りたくなったらdistance関数を使うことで知ることができます。

C++
// イテレータによるループ
for(vector<int>::iterator itr = data.begin(); itr != data.end(); ++itr)
{
    // インデックスの取得
    int idx = std::distance(data.begin(), itr);
}

また、C++11以降では以下のようにループ変数の宣言を置き換えることも可能です。

C++11
// イテレータによるループ
for(auto itr = data.begin(); itr != data.end(); ++itr)
{
    // 処理
}

さらに、C++14以降では範囲for文を使って以下のように書き換えることも可能です。

C++14
// 範囲for文によるループ
for(auto& d : data)
{
    // 処理
}

お試しコード

ここまででざっとvectorの基本的な使い方についての解説を行いました。

これらを使って「1〜100までデータに追加後、奇数データを削除する」プログラムを書いてみます。

C++
#include <iostream>
#include <vector>
using namespace std;

// データ数
#define N 100

int main()
{
    // データ
    vector<int> data;

    // データに1〜100を追加
    for(int idx = 0; idx < N; idx++)
    {
        // 末尾にデータを追加
        data.push_back(idx + 1);
    }

    // 奇数データを削除
    for(int idx = (int)data.size() - 1; idx >= 0; idx--)
    {
        // 奇数データの場合
        if(data[idx] % 2 != 0)
        {
            // データ削除
            data.erase(data.begin() + idx);
        }
    }

    // データ出力
    for(auto d : data)
    {
        cout << d << " ";
    }

    return 0;
}

上記のプログラムを実行すると、2〜100までの偶数がスペース区切りで出力されます。

ちなみに、「奇数データを削除」処理でループインデックスを末尾から回しているのは、先頭から削除した場合には削除後のvector型変数のデータ位置がずれてしまうためで、ループ内で任意の位置のデータを削除する場合には末尾からループすると覚えておいてください。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です