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

提供: C++入門
移動: 案内検索
(ページの作成:「<!-- vim: filetype=mediawiki --> std::vector は、C++ライブラリ で提供されるtemplateを利用した動的な配列です。 読み方 ;[[std:...」)
 
 
(同じ利用者による、間の21版が非表示)
行1: 行1:
<!--
+
[[std::vector]] は、[[C++ライブラリ]] で提供される[[テンプレート]]を利用した動的な配列です。
vim: filetype=mediawiki
+
-->
+
 
+
[[std::vector]] は、[[C++ライブラリ]] で提供される[[template]]を利用した動的な配列です。
+
 
+
読み方
+
  
 +
'''読み方'''
 
;[[std::vector]]: えすてぃーでぃー べくたー
 
;[[std::vector]]: えすてぃーでぃー べくたー
  
行12: 行7:
  
 
== 概要 ==
 
== 概要 ==
 
 
[[C++]] の配列は、サイズをプログラマが管理しますが、[[std::vector]] は、配列のサイズを意識せずに、プログラミングできます。
 
[[C++]] の配列は、サイズをプログラマが管理しますが、[[std::vector]] は、配列のサイズを意識せずに、プログラミングできます。
 +
STLに含まれるvectorなどのデータを管理するテンプレートクラスをコンテナと呼びます。
  
== std::vector のシンプルな例 ==
+
* [[std::vector シンプルな例]]
 
+
* [[std::vecotrを2次元配列として扱う]]
=== ソースコード vector_int_1.cpp ===
+
* [[std::vectorで構造体を扱う]]
 +
* [[std::vectorをコピーする]]
 +
* [[std::vector::insert]] : insertで[[std::vector]]を連結できます。
 +
== インタフェース ==
 +
{|class="wikitable"
 +
|+ std::vector
 +
! メンバ
 +
! 意味
 +
|-
 +
| [[std::vector::vector|constructor]]
 +
| vectorのコンストラクタ。vectorを初期化します。
 +
|-
 +
| destrctor
 +
| デストラクタ
 +
|-
 +
| <!-- [[std::vector::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&#91;&#93;]] --> operator&#91;&#93; は、境界チェックをしません。
 +
|-
 +
| <!-- [[std::vector::operator[]|operator&#91;&#93;]] --> operator&#91;&#93;
 +
| [[std::vector]] の n 番目の要素の参照を返します。<!-- [[std::vector::operator[]|operator&#91;&#93;]]--> operator&#91;&#93; は、境界チェックをしません。
 +
|-
 +
| [[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">
 
<syntaxhighlight lang="cpp">
 
#include <iostream>
 
#include <iostream>
 
#include <vector>
 
#include <vector>
 +
using namespace std;
  
int main(int argc, char const* argv[])
+
int
 +
main(int argc, char const* argv[])
 
{
 
{
         std::vector<int>       v;
+
         std::vector<int> v{1,2,3};
 +
        for (auto x: v) {
 +
                cout << x << endl;
 +
        }
 +
        return 0;
 +
}
 +
</syntaxhighlight>
  
        v.push_back(1);
+
== vectorの使用例 ==
        v.push_back(2);
+
* [[std::vector シンプルな例]]
        v.push_back(3);
+
  
        for(std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
+
== vectorを連結する例 ==
                 std::cout << *it << std::endl;
+
[[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;
 
         return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
 
=== コンパイル ===
 
=== コンパイル ===
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
g++  vector_int_1.cpp -o vector_int_1
+
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>
 
 
=== 実行例 ===
 
=== 実行例 ===
 
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
% ./vector_int_1
+
% ./vector_add_vector1
1
+
1 2 3 4 5 6
2
+
3
+
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== 関連項目 ==
+
== vecotrをソートする ==
 +
[[std::vector]]をソート(sort)するには、[[std::sort]]を利用します。
 +
vectorをソートしたり、構造体のvectorをソートできます。
 +
詳細については、[[std::sort]]をご参照ください。
  
 +
== 関連項目 ==
 
* [[C++ライブラリ]]
 
* [[C++ライブラリ]]
 +
* [[std::sort]] : [[std::vector]]をソートします。
 +
* [[std::rotate]]
 +
<!-- vim: filetype=mediawiki
 +
-->
 +
{{vector}}
 +
{{container}}

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

std::vector は、C++ライブラリ で提供されるテンプレートを利用した動的な配列です。

読み方

std::vector
えすてぃーでぃー べくたー

概要

C++ の配列は、サイズをプログラマが管理しますが、std::vector は、配列のサイズを意識せずに、プログラミングできます。 STLに含まれるvectorなどのデータを管理するテンプレートクラスをコンテナと呼びます。

インタフェース

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

C++11forautoを併用すると簡単に書けます。

#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をご参照ください。

関連項目

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で追加された、コンテナサイズを領域に合わせます。メモリの解放に利用します。

シーケンスコンテナ

連想コンテナ

連行コンテナ 順不同

コンテナアダプタ

コンテナへのアクセスで利用

コンテナで役立つC++11以降の機能