std::vector::insert

提供: C++入門
移動: 案内検索
スポンサーリンク

std::vector::insert とは、std::vectorに要素を追加するメンバ関数の1つです。他の方法は、std::vector::push_backです。std::vector::insertを利用して、vectorを連結することもできます。std::vector::insertは、任意のポジション(イテレータ)に要素を追加できます。コンテナへの大規模な要素の追加を行う場合には、resize()でサイズを調整してから追加する方が良いパフォーマンスとなります。

読み方

std::vector::insert
えすてぃーでぃー べくたー いんさーと

概要

std::vectorのinsert では、以下のいずれかの動作ができます。

  • 値をポジション(イテレータ)の直前に追加し、追加した要素を指すイテレータを返す。
  • 値を「指定された個数」作成し、ポジションの直前に追加する。
  • 開始から終了までの要素をポジションの直前に追加する。

大量のデータをinsertによって追加する場合には、resize()でvectorのサイズを調整しておくと、パフォーマンスの劣化を防げます。

std::vector::insertの例

先頭に要素を1つ追加する

これは、先頭に値を追加する例です。

it = v.begin();         // 先頭のイテレータを取得
it = v.insert(it,200);  //先頭に200を追加

先頭に同じ要素を2つ追加する

これは、先頭に300を2つ追加する例です。

v.insert(it,2,300);     // 先頭に300,300を追加

vectorを連結する

vectorを連結(結合)する例です。v1の後ろにv2を連結します。

vector<int> v1{1,2,3}, v2{4,5,6};
v1.insert(v1.end(), v2.begin(), v2.end());

vectorを連結(結合)する例です。vの前に、v2が追加されます。

vector<int> v2{503,502,501};
v.insert(v.begin(), v2.begin(), v2.end()); // 先頭にv2を追加

大規模なデータを追加する場合

200でcount分、vecotrを埋める例です。

int value = 200;
unsigned long count = 10000000;
vector<int> v;
vector<int>::iterator it;
 
v.resize(count);	// 追加するデータサイズを考慮して、resize()します
 
it = v.begin();
v.insert(it,count,value);

v.resize()を使用した場合(resize.out)と使用しなかった場合(none_resize.out)では、実行時間が6倍以上違います。

/usr/bin/time ./none_resize.out
        4.23 real         4.12 user         0.10 sys
/usr/bin/time ./none_resize.out
        4.72 real         4.65 user         0.05 sys
/usr/bin/time ./none_resize.out
        4.31 real         4.20 user         0.04 sys
 
/usr/bin/time ./resize.out
        0.68 real         0.56 user         0.11 sys
/usr/bin/time ./resize.out
        0.69 real         0.42 user         0.26 sys
/usr/bin/time ./resize.out
        0.67 real         0.55 user         0.12 sys

プロトタイプ

// single element (1)	
iterator insert (const_iterator position, const value_type& val);
 
// fill (2)	
iterator insert (const_iterator position, size_type n, const value_type& val);
 
// range (3)	
template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);
 
// move (4)	
iterator insert (const_iterator position, value_type&& val);
 
// initializer list (5)	
iterator insert (const_iterator position, initializer_list<value_type> il);

vector_insert1.cpp の例

ソースコード vector_insert1.cpp

#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char const* argv[])
{
        vector<int> v(3, 100); // 100,100,100
        vector<int>::iterator it;
 
        it = v.begin();         // 先頭のイテレータを取得
        it = v.insert(it,200);  //先頭に200を追加
        v.insert(it,2,300);     // 先頭に300,300を追加
 
        vector<int> v2{503,502,501};
        v.insert(v.begin(), v2.begin(), v2.end()); // 先頭にv2を追加
 
        for(auto i: v) {
                cout << i << " ";
        }
        cout << endl;
        return 0;
}

コンパイル

g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49  vector_insert1.cpp -o vector_insert1

実行例

% ./vector_insert1
503 502 501 300 300 200 100 100 100

vectorにvectorを連結する例

ソースコード vector_add_vector1.cpp

#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char const* argv[])
{
        vector<int> v1{1,2,3}, v2{4,5,6};
 
        v1.insert(v1.end(), v2.begin(), v2.end());
        for(auto i: v1) {
                cout << i << " ";
        }
        cout << endl;
        return 0;
}

コンパイル

g++49 -std=c++11 -I/usr/local/lib/gcc49/include/c++/ \
-Wl,-rpath=/usr/local/lib/gcc49  vector_add_vector1.cpp -o vector_add_vector1

実行例

% ./vector_add_vector1
1 2 3 4 5 6

関連項目




スポンサーリンク