「std::vector::insert」の版間の差分
提供: C++入門
行1: | 行1: | ||
− | [[std::vector::insert]] とは、[[std::vector]]に要素を追加するメンバ関数の1つです。他の方法は、[[std::vector::push_back]]です。[[std::vector::insert]]を利用して、vectorを連結することもできます。[[std::vector::insert]]は、任意のポジション(イテレータ) | + | [[std::vector::insert]] とは、[[std::vector]]に要素を追加するメンバ関数の1つです。他の方法は、[[std::vector::push_back]]です。[[std::vector::insert]]を利用して、vectorを連結することもできます。[[std::vector::insert]]は、任意のポジション(イテレータ)に要素を追加できます。コンテナへの大規模な要素の追加を行う場合には、resize()でサイズを調整してから追加する方が良いパフォーマンスとなります。 |
'''読み方''' | '''読み方''' | ||
行10: | 行10: | ||
* 値を「指定された個数」作成し、ポジションの直前に追加する。 | * 値を「指定された個数」作成し、ポジションの直前に追加する。 | ||
* 開始から終了までの要素をポジションの直前に追加する。 | * 開始から終了までの要素をポジションの直前に追加する。 | ||
+ | |||
+ | 大量のデータをinsertによって追加する場合には、resize()でvectorのサイズを調整しておくと、パフォーマンスの劣化を防げます。 | ||
== std::vector::insertの例 == | == std::vector::insertの例 == | ||
行36: | 行38: | ||
vector<int> v2{503,502,501}; | vector<int> v2{503,502,501}; | ||
v.insert(v.begin(), v2.begin(), v2.end()); // 先頭にv2を追加 | 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> | ||
2014年7月5日 (土) 22:32時点における版
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