パハットノート

※当サイトではGoogleアドセンス広告を利用しています

C++ vector(追加、削除、並び替え、2次元など)



基本(1次元配列)

宣言と初期化

可変長の1次元配列の宣言は

std::vector<型名> 変数名;

というようにできます。

また、宣言と同時に初期化をすることも可能です。通常の配列の様に

//中身が{3, 4, 2}の可変長配列
std::vector<int> intVec{ 3, 4, 2 };

と宣言することができます。

また、要素をすべて同じNで初期化(全て0にするなど)の場合は(要素数, N)と初期化することもできます。

//中身が{0, 0, 0}の可変長配列
std::vector<int> zeroVec(3, 0);



大きさの取得

  • 変数名.size()とすることで要素数を簡単に取得ができます。
  • これを利用すればfor文などが実装できます。

ソースコード

#include<iostream>
#include<vector>

int main() {
	//中身が{3, 4, 2}の可変長配列
	std::vector<int> intVec{ 3, 4,2 };

	//配列のサイズを取得
	std::cout << "配列のサイズ:" << intVec.size() << std::endl;
}


実行結果

配列のサイズ:3



for文での表示

  • 先ほども触れたfor文の実装です。
  • 範囲for文というC++特有の方法もありますが本記事では触れません。

ソースコード

#include<iostream>
#include<vector>

int main() {
	//中身が{3, 4, 2}の可変長配列
	std::vector<int> intVec{ 3, 4,2 };  

	// C言語のようなfor文で表示
    for(int i = 0; i < intVec.size(); i++) {
        std::cout << "intVec[" << i << "] = " << intVec[i] << std::endl;
    }
}


実行結果

intVec[0] = 3
intVec[1] = 4
intVec[2] = 2



末尾への要素の追加

  • 「可変長」とついているので要素を追加することが可能です。
  • 変数名.push_back(追加したい要素)とすることで末尾に要素を追加することが可能です。

ソースコード

#include<iostream>
#include<vector>

int main() {
	//中身が{3, 4, 2}の可変長配列
	std::vector<int> intVec{ 3, 4,2 };

	//末尾に7を追加
	std::cout << "末尾に7を追加" << std::endl;
	intVec.push_back(7);

	//中身を列挙
	for (int i = 0; i < intVec.size(); i++) {
		printf("intVec[%d] = %d\n", i, intVec[i]);
	}
}


実行結果

末尾に7を追加
intVec[0] = 3
intVec[1] = 4
intVec[2] = 2
intVec[3] = 7



任意の位置への要素の追加(insert)&削除(erase)

insertはbegin()~end()までだが、endはbegin()~end()-1までな点に注意。

ソースコード

#include <iostream>
#include <vector>

// vectorを表示する関数
void display(const std::vector<int>& intVec){
    std::cout << "intVec = { ";
    for (int i = 0; i < intVec.size(); i++) {
        std::cout << intVec[i] << ", ";
    }
    puts("}\n");
}

int main() {

    //中身が{3, 4, 2}の可変長配列
    std::vector<int> intVec{ 3, 4, 2 };

    std::cout << "前から1番目に-2を追加" << std::endl;
    intVec.insert(intVec.begin() + 1, -2);
    display(intVec); //中身を列挙

    std::cout << "後ろから1番目に10を追加" << std::endl;
    intVec.insert(intVec.end() - 1, 10);
    display(intVec); //中身を列挙

    std::cout << "前から2番目の要素(4)を削除" << std::endl;
    intVec.erase(intVec.begin() + 2);
    display(intVec); //中身を列挙

    std::cout << "後ろから0番目の要素(2)を削除" << std::endl;
    intVec.erase(intVec.end() - 1);
    display(intVec); //中身を列挙
}


実行結果

前から1番目に-2を追加
intVec = { 3, -2, 4, 2, }

後ろから1番目に10を追加
intVec = { 3, -2, 4, 10, 2, }

前から2番目の要素(4)を削除
intVec = { 3, -2, 10, 2, }

後ろから0番目の要素(2)を削除
intVec = { 3, -2, 10, }



並び替え(sort)

  • sortという整列用の関数を使えるようになります。
  • sort関数を使うには以下のインクルードが必要です。

C++では、

#include <algorithm>


ソースコード

  • コメントアウトの箇所を動かせば降順になります
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    
    //宣言
    std::vector<int> intVec{ 3, 4, 2, 10, 8, -1 };

    //昇順ソート
    std::sort(intVec.begin(), intVec.end());

    //降順ソート
    //std::sort(intVec.begin(), intVec.end(), std::greater<>());

    //中身を列挙
    for (int i = 0; i < intVec.size(); i++) {
        printf("intVec[%d] = %d\n", i, intVec[i]);
    }

    return 0;
}


実行結果

intVec[0] = -1
intVec[1] = 2
intVec[2] = 3
intVec[3] = 4
intVec[4] = 8
intVec[5] = 10





応用例:2次元配列

宣言と初期化

2次元配列となると宣言が少し複雑になり、

std::vector<std::vector<型名>> 変数名;

と宣言します。

1次元配列と同様の初期化が可能であり、通常の配列の様にする場合は、

std::vector<std::vector<int>> intVec2{ {3, 2}, {1, 9} };

と宣言し、要素をすべて同じ0で初期化する場合は、

//3行2列の零行列
std::vector<std::vector<int>> zeroVec2(3, std::vector<int>(2, 0));

とします。


for文でのループ

2次元の可変長配列vecを行列として考えると

  • vec.size()で行数
  • vec[0].size()で列数

を取得できるので、これを利用すれば2次元の可変長配列に対しても簡単にfor文を実装できます。

ソースコード

#include<iostream>
#include<vector>

int main() {
	//2次元の可変長配列
	std::vector<std::vector<int>> intVec2{ {1, 2}, {3, 4}, {5, 6} };

	//2行2列の零行列
	std::vector<std::vector<int>> zeroVec2(2, std::vector<int>(2, 0));

	//配列のサイズを取得
	printf("%d%d列の行列\n", intVec2.size(), intVec2[0].size());

	//中身を列挙
	for (int i = 0; i < intVec2.size(); i++) {
		for (int j = 0; j < intVec2[0].size(); j++) {
			std::cout << intVec2[i][j] << ", ";
		}
		puts("");
	}
}


実行結果

32列の行列
1, 2,
3, 4,
5, 6,