「std::vector」の版間の差分
提供: C++入門
(同じ利用者による、間の16版が非表示) | |||
行1: | 行1: | ||
− | + | [[std::vector]] は、[[C++ライブラリ]] で提供される[[テンプレート]]を利用した動的な配列です。 | |
− | + | ||
− | + | ||
− | + | ||
− | [[std::vector]] は、[[C++ライブラリ]] で提供される[[ | + | |
− | + | ||
− | + | ||
+ | '''読み方''' | ||
;[[std::vector]]: えすてぃーでぃー べくたー | ;[[std::vector]]: えすてぃーでぃー べくたー | ||
行12: | 行7: | ||
== 概要 == | == 概要 == | ||
− | |||
[[C++]] の配列は、サイズをプログラマが管理しますが、[[std::vector]] は、配列のサイズを意識せずに、プログラミングできます。 | [[C++]] の配列は、サイズをプログラマが管理しますが、[[std::vector]] は、配列のサイズを意識せずに、プログラミングできます。 | ||
+ | STLに含まれるvectorなどのデータを管理するテンプレートクラスをコンテナと呼びます。 | ||
* [[std::vector シンプルな例]] | * [[std::vector シンプルな例]] | ||
− | + | * [[std::vecotrを2次元配列として扱う]] | |
+ | * [[std::vectorで構造体を扱う]] | ||
+ | * [[std::vectorをコピーする]] | ||
+ | * [[std::vector::insert]] : insertで[[std::vector]]を連結できます。 | ||
== インタフェース == | == インタフェース == | ||
− | |||
{|class="wikitable" | {|class="wikitable" | ||
|+ std::vector | |+ std::vector | ||
行25: | 行22: | ||
|- | |- | ||
| [[std::vector::vector|constructor]] | | [[std::vector::vector|constructor]] | ||
− | | | + | | vectorのコンストラクタ。vectorを初期化します。 |
|- | |- | ||
| destrctor | | destrctor | ||
| デストラクタ | | デストラクタ | ||
|- | |- | ||
− | | [[std::vector::operator=|operator=]] | + | | <!-- [[std::vector::operator=|operator=]] --> operator= |
| operator= | | operator= | ||
+ | |- | ||
+ | | <!-- [[std::vector::reserve|reserve]] --> reserve | ||
+ | | [[std::vector]]のキャパシティを予約します。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::capacity|capacity]] --> capacity | ||
+ | | 割り当てられているストレージキャパシティのサイズを返します。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::size|size]] --> size | ||
+ | | サイズを返します。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::max_size|max_size]] -> max_size | ||
+ | | 最大サイズを返します。 | ||
+ | |- | ||
+ | | <! -- [[std::vector::resize|resize]] --> resize | ||
+ | | サイズをリサイズします。 | ||
+ | |- | ||
+ | | [[std::vector::shrink_to_fit|shrink_to_fit]] | ||
+ | | コンテナのキャパシティにフィットしたサイズまで縮小します。 | ||
+ | |- | ||
+ | | [[std::vector::push_back|push_back]] | ||
+ | | [[std::vector]] の最後に新しい要素を追加します。要素は、コピー、もしくは、move されます。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::pop_back|pop_back]] --> | ||
+ | | [[std::vector]] の最後の要素を取り除きます。コンテナのサイズが1つ小さくなります。 | ||
+ | |- | ||
+ | | [[std::vector::insert|insert]] | ||
+ | | [[std::vector]] に新しい要素を追加します。vector同士を連結できます。 | ||
+ | |- | ||
+ | | [[std::vector::erase|erase]] | ||
+ | | [[std::vector]] の1つの要素、または、要素のレンジを削除します。 | ||
+ | |- | ||
+ | | [[std::vector::clear|clear]] | ||
+ | | [[std::vector]] の要素をすべて削除します。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::empty|empty]] --> empty | ||
+ | | [[std::vector]] が空であれば、trueを返し、そうでなければ、falseです。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::begin|begin]] --> begin | ||
+ | | [[std::vector]] の最初の要素のイテレータを返します。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::end|end]] -> end | ||
+ | | [[std::vector]] の最後の要素の次のイテレータを返します。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::front|front]] --> front | ||
+ | | [[std::vector]] の最初の要素の参照を返します。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::back|back]] --> back | ||
+ | | [[std::vector]] の最後の要素の参照を返します。 | ||
+ | |- | ||
+ | | [[std::vector::at|at]] | ||
+ | | [[std::vector]] の n 番目の要素の参照を返します。無効な要素にアクセスしたとき、<!-- [[std::out_of_range]] --> std::out_of_range の例外を送出します。<!-- [[std::vector::operator[]|operator[]]] --> operator[] は、境界チェックをしません。 | ||
+ | |- | ||
+ | | <!-- [[std::vector::operator[]|operator[]]] --> operator[] | ||
+ | | [[std::vector]] の n 番目の要素の参照を返します。<!-- [[std::vector::operator[]|operator[]]]--> operator[] は、境界チェックをしません。 | ||
+ | |- | ||
+ | | [[std::vector::shrink_to_fit]] | ||
+ | | [[C++11]]で追加された、コンテナサイズを領域に合わせます。メモリの解放に利用します。 | ||
|} | |} | ||
+ | == サンプルコード == | ||
+ | === auto1.cpp === | ||
+ | [[C++11]]の[[for]]と[[auto]]を併用すると簡単に書けます。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <iostream> | ||
+ | #include <vector> | ||
+ | using namespace std; | ||
− | == | + | int |
+ | main(int argc, char const* argv[]) | ||
+ | { | ||
+ | std::vector<int> v; | ||
+ | v.push_back (1); | ||
+ | v.push_back (2); | ||
+ | v.push_back (3); | ||
+ | for (auto x: v) { | ||
+ | cout << x << endl; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | === auto2.cpp === | ||
+ | [[C++11]]では、[[コンテナ]]の初期化([[std::initializer_list]])もできます。 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | #include <iostream> | ||
+ | #include <vector> | ||
+ | using namespace std; | ||
+ | int | ||
+ | main(int argc, char const* argv[]) | ||
+ | { | ||
+ | std::vector<int> v{1,2,3}; | ||
+ | for (auto x: v) { | ||
+ | cout << x << endl; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == vectorの使用例 == | ||
+ | * [[std::vector シンプルな例]] | ||
+ | |||
+ | == vectorを連結する例 == | ||
+ | [[std::vector]]は、v1+=v2;やv0=v1+v2;といった連結ができません。 | ||
+ | [[std::vector]]の連結は、[[std::vector::insert]]を利用して、実現できます。 | ||
+ | === ソースコード vector_add_vector1.cpp === | ||
+ | <syntaxhighlight lang="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; | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | === コンパイル === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | === 実行例 === | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | % ./vector_add_vector1 | ||
+ | 1 2 3 4 5 6 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == vecotrをソートする == | ||
+ | [[std::vector]]をソート(sort)するには、[[std::sort]]を利用します。 | ||
+ | vectorをソートしたり、構造体のvectorをソートできます。 | ||
+ | 詳細については、[[std::sort]]をご参照ください。 | ||
+ | |||
+ | == 関連項目 == | ||
* [[C++ライブラリ]] | * [[C++ライブラリ]] | ||
− | * [[ | + | * [[std::sort]] : [[std::vector]]をソートします。 |
− | + | * [[std::rotate]] | |
− | + | <!-- vim: filetype=mediawiki | |
− | * [[std:: | + | --> |
+ | {{vector}} | ||
+ | {{container}} |
2016年1月10日 (日) 20:17時点における最新版
std::vector は、C++ライブラリ で提供されるテンプレートを利用した動的な配列です。
読み方
- std::vector
- えすてぃーでぃー べくたー
目次
概要
C++ の配列は、サイズをプログラマが管理しますが、std::vector は、配列のサイズを意識せずに、プログラミングできます。 STLに含まれるvectorなどのデータを管理するテンプレートクラスをコンテナと呼びます。
- std::vector シンプルな例
- std::vecotrを2次元配列として扱う
- std::vectorで構造体を扱う
- std::vectorをコピーする
- std::vector::insert : insertでstd::vectorを連結できます。
インタフェース
メンバ | 意味 |
---|---|
constructor | vectorのコンストラクタ。vectorを初期化します。 |
destrctor | デストラクタ |
operator= | operator= |
reserve | std::vectorのキャパシティを予約します。 |
capacity | 割り当てられているストレージキャパシティのサイズを返します。 |
size | サイズを返します。 |
resize | サイズをリサイズします。 |
shrink_to_fit | コンテナのキャパシティにフィットしたサイズまで縮小します。 |
push_back | std::vector の最後に新しい要素を追加します。要素は、コピー、もしくは、move されます。 |
std::vector の最後の要素を取り除きます。コンテナのサイズが1つ小さくなります。 | |
insert | std::vector に新しい要素を追加します。vector同士を連結できます。 |
erase | std::vector の1つの要素、または、要素のレンジを削除します。 |
clear | std::vector の要素をすべて削除します。 |
empty | std::vector が空であれば、trueを返し、そうでなければ、falseです。 |
begin | std::vector の最初の要素のイテレータを返します。 |
front | std::vector の最初の要素の参照を返します。 |
back | std::vector の最後の要素の参照を返します。 |
at | std::vector の n 番目の要素の参照を返します。無効な要素にアクセスしたとき、 std::out_of_range の例外を送出します。 operator[] は、境界チェックをしません。 |
operator[] | std::vector の n 番目の要素の参照を返します。 operator[] は、境界チェックをしません。 |
std::vector::shrink_to_fit | C++11で追加された、コンテナサイズを領域に合わせます。メモリの解放に利用します。 |
サンプルコード
auto1.cpp
#include <iostream> #include <vector> using namespace std; int main(int argc, char const* argv[]) { std::vector<int> v; v.push_back (1); v.push_back (2); v.push_back (3); for (auto x: v) { cout << x << endl; } return 0; }
auto2.cpp
C++11では、コンテナの初期化(std::initializer_list)もできます。
#include <iostream> #include <vector> using namespace std; int main(int argc, char const* argv[]) { std::vector<int> v{1,2,3}; for (auto x: v) { cout << x << endl; } return 0; }
vectorの使用例
vectorを連結する例
std::vectorは、v1+=v2;やv0=v1+v2;といった連結ができません。 std::vectorの連結は、std::vector::insertを利用して、実現できます。
ソースコード 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
vecotrをソートする
std::vectorをソート(sort)するには、std::sortを利用します。 vectorをソートしたり、構造体のvectorをソートできます。 詳細については、std::sortをご参照ください。
関連項目
- C++ライブラリ
- std::sort : std::vectorをソートします。
- std::rotate
- std::vector シンプルな例
- std::vecotrを2次元配列として扱う
- std::vectorで構造体を扱う
- std::vectorをコピーする
- std::move: 所有権を移動する
- std::vector 特定の要素をカウントする
- std::sort : std::vectorをソートします。
- std::initializer_list
メンバ | 意味 |
---|---|
constructor | vectorのコンストラクタ。vectorを初期化します。 |
destrctor | デストラクタ |
operator= | operator= |
reserve | std::vectorのキャパシティを予約します。 |
capacity | 割り当てられているストレージキャパシティのサイズを返します。 |
size | サイズを返します。 |
resize | サイズをリサイズします。 |
shrink_to_fit | コンテナのキャパシティにフィットしたサイズまで縮小します。 |
push_back | std::vector の最後に新しい要素を追加します。要素は、コピー、もしくは、move されます。 |
std::vector の最後の要素を取り除きます。コンテナのサイズが1つ小さくなります。 | |
insert | std::vector に新しい要素を追加します。vector同士を連結できます。 |
erase | std::vector の1つの要素、または、要素のレンジを削除します。 |
clear | std::vector の要素をすべて削除します。 |
empty | std::vector が空であれば、trueを返し、そうでなければ、falseです。 |
begin | std::vector の最初の要素のイテレータを返します。 |
front | std::vector の最初の要素の参照を返します。 |
back | std::vector の最後の要素の参照を返します。 |
at | std::vector の n 番目の要素の参照を返します。無効な要素にアクセスしたとき、 std::out_of_range の例外を送出します。 operator[] は、境界チェックをしません。 |
operator[] | std::vector の n 番目の要素の参照を返します。 operator[] は、境界チェックをしません。 |
std::vector::shrink_to_fit | C++11で追加された、コンテナサイズを領域に合わせます。メモリの解放に利用します。 |
シーケンスコンテナ
- std::array
- std::vector
- std::deque
- std::list
- std::forward_list
連想コンテナ
連行コンテナ 順不同
コンテナアダプタ
コンテナへのアクセスで利用
コンテナで役立つC++11以降の機能
- std::iotaで各要素に連番の値を代入する。
- std::generateで各要素に値を代入する。
- std::for_eachで各要素に値を代入する。
- std::fillで各要素に同じ値を代入する。
- for文でstd::vector::push_backで1つ1つプッシュする。