「std::vector::insert」の版間の差分
提供: C++入門
(ページの作成:「std::vector::insert とは、std::vectorに要素を追加するメンバ関数の1つです。他の方法は、std::vector::push_backです。[[std::vec...」) |
|||
(同じ利用者による、間の3版が非表示) | |||
行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.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]] | ||
* [[std::vector::push_back]] | * [[std::vector::push_back]] | ||
− | * [[std::vector:: | + | * [[std::vector::erase]] |
* [[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