一、vectorとは?

ベクター(Vector)は、動的サイズの配列をカプセル化したシーケンスコンテナです。他の任意のタイプのコンテナと同様に、さまざまなタイプのオブジェクトを格納できます。簡単に言えば、ベクターは任意のタイプを格納できる動的配列です。


二、コンテナの特性

1. 順序シーケンス

シーケンスコンテナ内の要素は、厳密な線形順序で並べられています。シーケンス内の要素の位置を介して対応する要素にアクセスできます。

2. 動的配列

シーケンス内の任意の要素に高速で直接アクセスでき、ポインタ演算によってもアクセスできます。シーケンスの末尾に要素を比較的すばやく追加/削除する操作を提供します。

3. アロケータ対応(Allocator-aware)

コンテナはメモリアロケータオブジェクトを使用して、そのストレージ要件を動的に処理します。


三、基本関数の実装

1. コンストラクタ
  • vector(): 空のvectorを作成する
  • vector(int nSize): 要素数がnSizeのvectorを作成する
  • vector(int nSize, const t& t): 要素数がnSizeで、値がすべてtであるvectorを作成する
  • vector(const vector&): コピーコンストラクタ
  • vector(begin, end): [begin, end) 区間にある別の配列の要素をvectorにコピーする

2. 追加関数

  • void push_back(const T& x): ベクターの末尾に要素Xを追加する
  • iterator insert(iterator it, const T& x): ベクター内のイテレータが指す要素の前に要素xを追加する
  • iterator insert(iterator it, int n, const T& x): ベクター内のイテレータが指す要素の前に同じ要素xをn個追加する
  • iterator insert(iterator it, const_iterator first, const_iterator last): ベクター内のイテレータが指す要素の前に、同じ型の別のベクターの [first, last) のデータを挿入する

3. 削除関数

  • iterator erase(iterator it): ベクター内でイテレータが指す要素を削除する
  • iterator erase(iterator first, iterator last): ベクター内の [first, last) の要素を削除する
  • void pop_back(): ベクターの最後の要素を削除する
  • void clear(): ベクター内のすべての要素をクリアする

4. 走査関数

  • reference at(int pos): pos位置にある要素の参照を返す
  • reference front(): 先頭要素の参照を返す
  • reference back(): 末尾要素の参照を返す
  • iterator begin(): ベクターの先頭ポインタを返す。最初の要素を指す
  • iterator end(): ベクターの末尾ポインタを返す。ベクターの最後の要素の次の位置を指す
  • reverse_iterator rbegin(): 逆イテレータ。最後の要素を指す
  • reverse_iterator rend(): 逆イテレータ。最初の要素の前の位置を指す

5. 判定関数

  • bool empty() const: ベクターが空かどうかを判定する。空の場合、ベクターには要素がない

6. サイズ関数

  • int size() const: ベクター内の要素数を返す
  • int capacity() const: 現在のベクターが収容できる最大要素数を返す
  • int max_size() const: 許容されるvectorの最大要素数を返す

7. その他の関数

  • void swap(vector&): 同じ型の2つのベクターのデータを交換する
  • void assign(int n, const T& x): ベクターの先頭からn個の要素の値をxに設定する
  • void assign(const_iterator first, const_iterator last): ベクター内の [first, last) の要素を現在のベクターの内容に設定する

8. 一目でわかる

1. push_back 配列の最後にデータを1つ追加する

2. pop_back 配列の最後のデータを削除する

3. at 番号位置のデータを取得する

4. begin 配列の先頭のポインタを取得する

5. end 配列の最後の要素+1のポインタを取得する

6. front 配列の先頭の参照を取得する

7. back 配列の最後の要素の参照を取得する

8. max_size vectorの最大サイズを取得する

9. capacity 現在のvectorに割り当てられたサイズ

10. size 現在使用しているデータのサイズ

11. resize 現在使用しているデータのサイズを変更する。現在の使用量より大きい場合はデフォルト値を埋める

12. reserve 現在のvecotrに割り当てられた空間のサイズを変更する

13. erase ポインタが指すデータ項目を削除する

14. clear 現在のvectorを空にする

15. rbegin vectorを反転した後の開始ポインタを返す(実際には元のend-1)

16. rend vectorを反転した後の終了ポインタを返す(実際には元のbegin-1)

17. empty vectorが空かどうかを判定する

18. swap 別のvectorとデータを交換する


四、基本的な使い方

#include < vector> 
using namespace std;

五、簡単な紹介

  1. Vector<型>識別子
  2. Vector<型>識別子(最大容量)
  3. Vector<型>識別子(最大容量, 初期値)
  4. Int i[5]={1,2,3,4,5}
    Vector<型>vi(I,i+2);// iインデックス値が3以降の値を取得する
  5. Vector< vector< int> >v; 2次元ベクター // ここで一番外側の<>にはスペースが必要。そうしないと古いコンパイラでは通らない

例

1. pop_back() & push_back(elem) の例:コンテナの末尾でデータを削除・挿入する

例

#include <string.h> #include <vector> #include <iostream> using namespace std; int main() { vector<int>obj;// int 型を格納するvectorコンテナを作成する for(int i=0;i<10;i++) // push_back(elem) は配列の最後にデータを追加する { obj.push_back(i); cout<<obj[i]<<","; } for(int i=0;i<5;i++)// 配列の最後のデータを削除する { obj.pop_back(); } cout<<"\n"<<endl; for(int i=0;i<obj.size();i++)// size() はコンテナ内の実際のデータ数 { cout<<obj[i]<<","; } return 0; }

出力結果:

0,1,2,3,4,5,6,7,8,9,

0,1,2,3,4,

2. clear() でコンテナ内のすべてのデータをクリアする

例

#include <string.h> #include <vector> #include <iostream> using namespace std; int main() { vector<int>obj; for(int i=0;i<10;i++)// push_back(elem) は配列の最後にデータを追加する { obj.push_back(i); cout<<obj[i]<<","; } obj.clear();// コンテナ内のすべてのデータをクリアする for(int i=0;i<obj.size();i++) { cout<<obj[i]<<endl; } return 0; }

出力結果:

0,1,2,3,4,5,6,7,8,9,

3. ソート

例

#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector<int>obj; obj.push_back(1); obj.push_back(3); obj.push_back(0); sort(obj.begin(),obj.end());//小さい順 cout<<"小さい順:"<<endl; for(int i=0;i<obj.size();i++) { cout<<obj[i]<<","; } cout<<"\n"<<endl; cout<<"大きい順:"<<endl; reverse(obj.begin(),obj.end());//大きい順 for(int i=0;i<obj.size();i++) { cout<<obj[i]<<","; } return 0; }

出力結果:

从小到大:
0,1,3,

从大到小:
3,1,0,

1.sort にはヘッダーファイルが必要なことに注意#include <algorithm>

2.sort で降順にしたい場合は、sort を書き直せばよい

bool compare(int a,int b) 
{ 
    return a< b; //升序排列,如果改为return a>b,则为降序 
} 
int a[20]={2,4,1,23,5,76,0,43,24,65},i; 
for(i=0;i<20;i++) 
    cout<< a[i]<< endl; 
sort(a,a+20,compare);

4. アクセス(直接配列アクセス & イテレータアクセス)

例

#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { //順次アクセス vector<int>obj; for(int i=0;i<10;i++) { obj.push_back(i); } cout<<"配列を直接利用する:"; for(int i=0;i<10;i++)//方法1 { cout<<obj[i]<<" "; } cout<<endl; cout<<"イテレータを利用する:" ; //方法2、イテレータを使用してコンテナ内のデータを出力する vector<int>::iterator it;//イテレータを宣言してvectorコンテナにアクセスする。役割:vectorコンテナの要素を走査または指す for(it=obj.begin();it!=obj.end();it++) { cout<<*it<<" "; } return 0; }

出力結果:

直接利用数组:0 1 2 3 4 5 6 7 8 9 
利用迭代器:0 1 2 3 4 5 6 7 8 9

5. 2次元配列の2つの定義方法(結果は同じ)

方法1

#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { int N=5, M=6; vector<vector<int> > obj(N); //2次元動的配列のサイズを5行と定義する for(int i =0; i< obj.size(); i++)//動的2次元配列は5行6列で、値はすべて0 { obj[i].resize(M); } for(int i=0; i< obj.size(); i++)//2次元動的配列を出力する { for(int j=0;j<obj[i].size();j++) { cout<<obj[i][j]<<" "; } cout<<"\n"; } return 0; }

方法2

#include <string.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { int N=5, M=6; vector<vector<int> > obj(N, vector<int>(M)); //2次元動的配列を5行6列で定義する for(int i=0; i< obj.size(); i++)//2次元動的配列を出力する { for(int j=0;j<obj[i].size();j++) { cout<<obj[i][j]<<" "; } cout<<"\n"; } return 0; }

出力結果:

0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 

原文アドレス:http://blog.csdn.net/w_linux/article/details/71600574