C++
 Computer >> コンピューター >  >> プログラミング >> C++

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++プログラミングが可能になります。

  1. C++ STLのcosh()関数とは?双曲線余弦の求め方をサンプルコード付きで解説

    cosh()関数とは? C++のSTLに組み込まれているcosh()関数は、ラジアン単位で与えられた角度の双曲線余弦(ハイパボリック・コサイン)を計算して返す関数です。使用するには、<cmath>ヘッダーをインクルードする必要があります。 双曲線余弦は、数学的に次の式で定義されます。 cosh(x) = (e^x + e^(-x)) / 2 構文 cosh()関数の構文は以下の通りです。 cosh(var) 構文から分かるように、cosh()関数はfloat型、double型、long double型のいずれかの引数varを受け取ります。そして、その双曲線余弦を返します。なお、引

  2. 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