「std::vector::insert」の版間の差分

提供: C++入門
移動: 案内検索
(関連項目)
 
(同じ利用者による、間の2版が非表示)
行1: 行1:
[[std::vector::insert]] とは、[[std::vector]]に要素を追加するメンバ関数の1つです。他の方法は、[[std::vector::push_back]]です。[[std::vector::insert]]を利用して、vectorを連結することもできます。
+
[[std::vector::insert]] とは、[[std::vector]]に要素を追加するメンバ関数の1つです。他の方法は、[[std::vector::push_back]]です。[[std::vector::insert]]を利用して、vectorを連結することもできます。[[std::vector::insert]]は、任意のポジション(イテレータ)に要素を追加できます。コンテナへの大規模な要素の追加を行う場合には、resize()でサイズを調整してから追加する方が良いパフォーマンスとなります。
  
 
'''読み方'''
 
'''読み方'''
行6: 行6:
  
 
== 概要 ==
 
== 概要 ==
 +
[[std::vector]]のinsert では、以下のいずれかの動作ができます。
 +
* 値をポジション(イテレータ)の直前に追加し、追加した要素を指すイテレータを返す。
 +
* 値を「指定された個数」作成し、ポジションの直前に追加する。
 +
* 開始から終了までの要素をポジションの直前に追加する。
  
 +
大量のデータをinsertによって追加する場合には、resize()でvectorのサイズを調整しておくと、パフォーマンスの劣化を防げます。
 +
== std::vector::insertの例 ==
 +
=== 先頭に要素を1つ追加する ===
 +
これは、先頭に値を追加する例です。
 +
<syntaxhighlight lang="cpp">
 +
it = v.begin();        // 先頭のイテレータを取得
 +
it = v.insert(it,200);  //先頭に200を追加
 +
</syntaxhighlight>
 +
=== 先頭に同じ要素を2つ追加する ===
 +
これは、先頭に300を2つ追加する例です。
 +
<syntaxhighlight lang="cpp">
 +
v.insert(it,2,300);    // 先頭に300,300を追加
 +
</syntaxhighlight>
 +
=== vectorを連結する ===
 +
vectorを連結(結合)する例です。v1の後ろにv2を連結します。
 +
<syntaxhighlight lang="cpp">
 +
vector<int> v1{1,2,3}, v2{4,5,6};
 +
v1.insert(v1.end(), v2.begin(), v2.end());
 +
</syntaxhighlight>
 +
 +
vectorを連結(結合)する例です。vの前に、v2が追加されます。
 +
<syntaxhighlight lang="cpp">
 +
vector<int> v2{503,502,501};
 +
v.insert(v.begin(), v2.begin(), v2.end()); // 先頭にv2を追加
 +
</syntaxhighlight>
 +
=== 大規模なデータを追加する場合 ===
 +
200でcount分、vecotrを埋める例です。
 +
<syntaxhighlight lang="cpp">
 +
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);
 +
</syntaxhighlight>
 +
 +
v.resize()を使用した場合(resize.out)と使用しなかった場合(none_resize.out)では、実行時間が6倍以上違います。
 +
<syntaxhighlight lang="bash">
 +
/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
 +
</syntaxhighlight>
 +
== プロトタイプ ==
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">
 
// single element (1)
 
// single element (1)
行60: 行120:
 
503 502 501 300 300 200 100 100 100
 
503 502 501 300 300 200 100 100 100
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== vectorにvectorを連結する例 ==
 
== vectorにvectorを連結する例 ==
 
=== ソースコード vector_add_vector1.cpp ===
 
=== ソースコード vector_add_vector1.cpp ===
行71: 行130:
 
         vector<int> v1{1,2,3}, v2{4,5,6};
 
         vector<int> v1{1,2,3}, v2{4,5,6};
  
        v1=v1+v2;
 
 
         v1.insert(v1.end(), v2.begin(), v2.end());
 
         v1.insert(v1.end(), v2.begin(), v2.end());
 
         for(auto i: v1) {
 
         for(auto i: v1) {
行90: 行148:
 
1 2 3 4 5 6
 
1 2 3 4 5 6
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
== 関連項目 ==
 
== 関連項目 ==
 
* [[std::vector]]
 
* [[std::vector]]
行97: 行154:
 
* [[auto]]
 
* [[auto]]
 
* [[C++11]]
 
* [[C++11]]
<!-- vim: filetype=mediawiki -->
+
<!-- vim: filetype=mediawiki
 +
-->

2016年1月10日 (日) 20:34時点における最新版

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

関連項目