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に変更されました。