【C++】STLのstd::vectorの使い方について詳しく解説

std::vectorは、可変長配列を扱うためのコンテナであり、非常に使い勝手が良く、処理効率を抜きにすると、すべての配列をstd::vectorに置き換えてもいいレベルの利便性です。

本記事では、初心者でもわかりやすくstd::vectorの基本的な使い方から応用的な使い方まで詳しく解説します。

目次から探す

std::vectorとは何か

std::vectorは、C++のSTL(Standard Template Library)に含まれるコンテナクラスの一つです。std::vectorは、可変長配列を表現するために使用されます。

通常の配列と異なり、std::vectorは要素数を動的に変更できます。

また、要素の追加や削除が容易であり、様々な便利なメソッドが用意されています。

例えば、以下のようにしてstd::vectorを宣言し、初期化することができます。

#include <vector>

int main() {
    // int型の要素を持つ空のstd::vectorを宣言
    std::vector<int> vec1;

    // int型の要素を持ち、初期値が1, 2, 3であるstd::vectorを宣言
    std::vector<int> vec2 = {1, 2, 3};

    return 0;
}

このようにしてstd::vectorを宣言することで、可変長配列を簡単に扱うことができます。

std::vectorの基本的な使い方

要素の追加

std::vectorに要素を追加する方法は、以下の2つがあります。

push_back()関数を使用する方法

std::vectorは、push_back()メソッドを使うことで、末尾に新しい要素を追加することができます。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vec;

    // 要素を追加する
    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    // 要素を表示する(要素数はsize()メソッドで取得可能)
    for (int i = 0; i < vec.size(); i++) {
        std::cout << vec[i] << std::endl;
    }

    return 0;
}
10
20
30

insert()関数を使用する方法

末尾ではなく、任意の場所に値を挿入したい場合は、insert()メソッドを使用します。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vec;

    vec.push_back(10);
    vec.push_back(20);
    vec.push_back(30);

    vec.insert(vec.end(), 40); // 要素を末尾に追加する
    vec.insert(vec.begin() + 0, 50); // 要素を0番目(10)の手前に追加する
    vec.insert(vec.begin() + 3, 60); // 要素を3番目の後ろに追加する

    // 要素を表示する
    for (int i = 0; i < vec.size(); i++) {
        std::cout << vec[i] << std::endl;
    }

    return 0;
}
50
10
20
60
30
40

要素の削除

std::vectorから要素を削除する方法は、以下の2つがあります。

pop_back()関数を使用する方法

pop_back()メソッドは、末尾にある要素を削除するメソッドです。

#include <iostream>
#include <vector>

int main()
{
   std::vector<int> vec;

   // 要素を追加する
   vec.push_back(10);
   vec.push_back(20);
   vec.push_back(30);

   // 最後尾の要素を削除する
   vec.pop_back();

   // 要素を表示する
   for (int i = 0; i < vec.size(); i++) {
       std::cout << vec[i] << std::endl;
   }

   return 0;
}
10
20

vecには10, 20, 30の3つの値が追加されていますが、その後にvec.pop_back();が呼ばれているため、末尾にある30が削除され、最終的にvecの中身は{10, 20}となっています。

erase()関数を使用する方法(指定した位置から複数個削除)

erase()メソッドは、指定した位置にある要素、または指定子た範囲の要素を削除するメソッドです。

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> vec;

    // 要素を追加する
    for (int i = 1; i <= 5; ++i) {
        vec.push_back(i * 10);
    }
    for (auto&& elem : vec) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    // 指定した位置から複数個削除する
    // (3番目から2個なので 30, 40 が消える)
    auto it = begin(vec) + 2;
    auto end_it = it + 2;


    it = vec.erase(it, end_it);

    // 削除後の要素を表示する
    for (auto&& elem : vec) {
        std::cout << elem << " ";
    }

    return 0;
}
10 20 30 40 50
10 20 50

要素のアクセス

std::vector内に格納されたデータにアクセスし、取得したり操作したりできます。 以下はその例です。


#include<iostream>
#include<vector>

using namespace std;

void print(vector<int>& v){
	for(int x:v){
		cout<<x<<" ";
	}
	cout<<endl;
}

int main(){
	vector<int> v={1,2,3,4,5};
	
	print(v);

	//atメソッドでもアクセスできる
	cout << v.at(4) << endl;
	
	return 0;
}
1 2 3 4 5
5

上記コードでは、print関数で全ての要素が出力されます。

ここまでのサンプルコードでもいくつか登場していますが、std::vectorは、通常の配列と同じようにv[0]の形で参照・代入することが可能です。

要素の変更

std::vector内に格納されたデータは、通常の変数と同じように変更可能です。

#include<iostream>
#include<vector>

using namespace std;

void print(vector<int>& v){
	for(int x:v){
		cout<<x<<" ";
	}
	cout<<endl;
}

int main(){
	vector<int> v={1,2,3,4,5};
	
	print(v);
	
	v[3] = 7;
	
	print(v);
	
	return 0;
}
1 2 3 4 5
1 2 3 7 5

上記コードでは、print関数で全ての要素が出力されます。 また、v[3]=7という操作で4番目(実際は3番目)にある数字が7に変更されました。

1 2 3

この記事のページ一覧
  1. 現在のページ
目次から探す