C++ STLのvector insert()関数の使い方を徹底解説
はじめに
C++ STLのvectorクラスが提供するinsert()関数は、指定した位置の要素の前に新しい要素を挿入することで、コンテナのサイズを動的に拡張できるメンバ関数です。
insert()はC++ STLにあらかじめ定義されている関数で、push_back()が末尾への追加しかできないのに対し、先頭や途中などvectorの任意の位置に要素を追加できる点が特徴です。
insert()関数の3つの構文
vectorのinsert()関数には、用途に応じて3種類の構文が用意されています。
1. 位置と値を指定して挿入する
vector_name.insert(pos, value);
挿入位置を示すイテレータposと挿入する値valueを指定します。指定した位置の前に、valueのコピーが1つ挿入されます。
2. 位置・値・個数を指定して挿入する
vector_name.insert(pos, size, value);
挿入位置posに、値valueをsize個挿入します。同じ値をまとめて複数個追加したい場合に便利です。
3. 別のvectorから範囲を指定して挿入する
empty_vector_name.insert(pos, iterator1, iterator2);
挿入先の位置posと、挿入元vectorの範囲を示す2つのイテレータ(iterator1〜iterator2)を指定します。値が格納されたvectorの内容を、空のvectorへ一括してコピーできます。
主なパラメータと戻り値
- pos: 挿入位置を示すイテレータ(v.begin()やv.end()など)
- value: 挿入する要素の値
- size: 挿入する要素の個数
- iterator1, iterator2: 挿入元の範囲を示すイテレータ(半開区間[first, last))
戻り値は、新しく挿入された要素の先頭を指すイテレータです。
アルゴリズム
開始
値を持つvector vを宣言する。
空のvector v1を宣言する。
vector<int>型のイテレータiterを宣言する。
vの先頭の前に値を挿入する。
個数を指定して、vの先頭の前に別の値を挿入する。
vの要素をすべて出力する。
vのイテレータを指定して、vの全要素をv1に挿入する。
v1の要素をすべて出力する。
終了。サンプルコード
#include<iostream>
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<int> v = { 50,60,70,80,90}, v1; // 値を持つvと空のv1を宣言
vector<int>::iterator iter; // イテレータを宣言
iter = v.insert(v.begin(), 40); // vの先頭の前に40を挿入
iter = v.insert(v.begin(), 1, 30); // vの先頭の前に30を1個挿入
cout << "The vector1 elements are: \n";
for (iter = v.begin(); iter != v.end(); ++iter)
cout << *iter << " "<<endl; // vの要素を出力
v1.insert(v1.begin(), v.begin(), v.end()); // vの全要素をv1に挿入
cout << "The vector2 elements are: \n";
for (iter = v1.begin(); iter != v1.end(); ++iter)
cout << *iter << " "<<endl; // v1の要素を出力
return 0;
}実行結果
The vector1 elements are: 30 40 50 60 70 80 90 The vector2 elements are: 30 40 50 60 70 80 90
処理の流れの解説
最初に、vector vは {50, 60, 70, 80, 90} で初期化されます。
v.insert(v.begin(), 40) を実行すると先頭に40が挿入され、vは {40, 50, 60, 70, 80, 90} になります。
次に v.insert(v.begin(), 1, 30) を実行すると、先頭に30が1個挿入され、vは {30, 40, 50, 60, 70, 80, 90} になります。
最後に v1.insert(v1.begin(), v.begin(), v.end()) を実行すると、vの全要素が空のv1へ一括コピーされ、両者の内容が一致します。
計算量と注意点
insert()の計算量は、挿入位置より後ろの要素数に比例するO(N)です。挿入位置以降の要素がすべて後ろへずらされるためです。
また、挿入によって要素数が現在の容量(capacity)を超える場合はメモリの再確保が発生し、既存のイテレータや参照がすべて無効になる点に注意が必要です。
まとめ
vectorのinsert()関数を使えば、任意の位置への要素挿入、同じ値の複数個挿入、別のvectorからの範囲挿入を柔軟に行えます。3つの構文を使い分けることで、より効率的なC++プログラミングが可能になります。
-
C++ STLのcosh()関数とは?双曲線余弦の求め方をサンプルコード付きで解説
cosh()関数とは? C++のSTLに組み込まれているcosh()関数は、ラジアン単位で与えられた角度の双曲線余弦(ハイパボリック・コサイン)を計算して返す関数です。使用するには、<cmath>ヘッダーをインクルードする必要があります。 双曲線余弦は、数学的に次の式で定義されます。 cosh(x) = (e^x + e^(-x)) / 2 構文 cosh()関数の構文は以下の通りです。 cosh(var) 構文から分かるように、cosh()関数はfloat型、double型、long double型のいずれかの引数varを受け取ります。そして、その双曲線余弦を返します。なお、引
-
C++ STLのsinh()関数の使い方を徹底解説
sinh()関数とはsinh()関数は、ラジアンで指定された値の双曲線正弦(ハイパボリックサイン)を返す関数です。C++のSTL(標準テンプレートライブラリ)に組み込まれており、<cmath>ヘッダをインクルードすることで利用できます。双曲線正弦は、以下の数式で定義されます。sinh(x) = (e^x − e^−x) / 2sinh()関数の構文sinh()関数の構文は以下のとおりです。sinh(var)構文からわかるように、sinh()関数はfloat型、double型、long double型のいずれかのパラメータvarを受け取ります。戻り値は、varの双曲線正弦です。sin