c++シーケンスコンテナの——vectorコンテナの実現(クラステンプレート)


前の紹介を見て今日はvector容器についてお話しします.まずvectorは私たちの数学でよく言われているベクトルです.すべてのvector容器はベクトルを格納する容器です.私たちは彼を配列と理解することができます.
vectorはシーケンステーブルを提供し、下付き演算子[]は有効です.vectorのメモリが切れた場合、より大きな連続メモリ領域を自動的に割り当て、元の要素を新しいメモリ領域にコピーし、古いメモリ領域を解放する必要があります.メモリの割り当ては、割り当てサブ(allocator)によって行われる.
vectorはランダムアクセス反復子(ポインタに相当)をサポートし、キュー、スタック、スタック、リスト、その他の複雑な構造を実現するために使用できます.つまり、vectorを習得した後、配列の代わりにvectorを使用することができます.
vectorの反復子は、通常、vector要素として実装されるポインタである.
1.システムコール
vectorクラスを使用する場合は、まずヘッダファイルを追加します.
#include

また、標準的なネーミングスペースを追加する必要があることに注意してください.
using namespace std;

クラステンプレートに相当します.まず、ベクトルコンテナを宣言するタイプでコンテナオブジェクトを構築します.
vector a;//               a
vector b;//               b
vector c;//                c

コンテナオブジェクトを定義すると、オブジェクトからコンテナを呼び出す方法があります.
vectorコンテナのメンバー方法はいろいろありますが、下に赤いマークが付いているのは私たちが日常的に使っているときによくあるものです.
assign
ベクトルと指定した要素を消去して空のベクトルにコピーします.
at
指定した位置にある要素対ベクトルを返します.
back
最後のベクトルの要素の参照を返します.
begin
ランダムアクセス反復ベクトルの最初の要素を返します.
capacity
戻りベクトルには、より多くのストレージが割り当てられていない要素の数が含まれる場合があります.
cbegin
ランダムアクセスconst反復ベクトルの最初の要素を返します.
cend
ランダムアクセスconst反復器を返すのは、ベクトルの末尾以外の点です.
crbegin
消去されたベクトルの最初の要素にはconst反復器が返されます.
crend
消込されたベクトルの末尾には定数の反復器が返されます.
clear
ベクトルの要素を消去します.
data
ポインタをベクトルの最初の要素に戻します.
emplace
指定した位置のベクトル構造の要素に挿入します.
emplace_back
コンストラクションベクトルの末尾の要素を追加します.
empty
テストベクトルコンテナは空です.
end
ランダムアクセス反復器がベクトルの末尾を指すことを返します.
消去
ベクトルを指定した位置から要素または範囲の要素を削除します.
front
ベクトルで返される最初の要素の参照.
get_allocator
オブジェクトがallocatorベクトルで使用されるクラスを返します.
挿入
指定した位置のベクトルを挿入する要素の数.
max_size
ベクトルの最大長を返します.
pop_back
最後のベクトルの要素を削除します.
push_back
ベクトルの最後に要素を追加します.
rbegin
消去されたベクトルの最初の要素には、反復器が返されます.
rend
消込されたベクトルの末尾は反復器に戻ります.
reserve
ベクトルオブジェクトとして保存される最小長さを保持します.
resize
ベクトルに対応する新しいサイズを指定します.
shrink_to_fit
過剰な容量を放棄します.
size
ベクトル内の要素の数を返します.
2.自主的にvector容器類テンプレート部分機能を実現
コンテナ内の要素にアクセスしたい場合は、オブジェクト指向ポインタ、つまりよく言われる反復子(反復器)を使用してアクセスする必要があります.ここでは説明しませんが、後で反復子に関するブログを書きます.
上記はvectorコンテナを使用するためにシステム呼び出しを採用していますが、vectorクラスを自分で実現するにはどうすればいいのでしょうか.このvectorクラステンプレートをコードで実装します
#include 

template//     
class vector
{
public:
	vector()//    
	{
		maxsize=2;
		arr=new T [2]();
		nowsize=0;
		printf("    
"); } ~vector()// { delete[] arr; arr=NULL; } vector(const vector&rhs) { arr=new T[rhs.maxsize]();// rhs for(int i=0;i void vector::inserthead(T val) { if(maxsize==nowsize)// , { add(); } for(int i=nowsize;i>0;i--) { arr[i]=arr[i-1];// } arr[0]=val; nowsize++; } template void vector::inserttail(T val) { if(maxsize==nowsize)// , { add();// } arr[nowsize]=val; nowsize++; } template void vector::insertpos(T val,int pos) { if(pos>maxsize-1) { printf("
"); return; } if(maxsize==nowsize)// , { add(); } for(int i=nowsize;i>pos;i--) { arr[i]=arr[i-1];// } arr[pos]=val; nowsize++; } template void vector::deletehead() { for(int i=0;i void vector::deletepos(int pos) { if(pos>maxsize-1) { return; } for(int i=pos;i void vector::deletetail() { nowsize--; } template T *vector::add() { maxsize=maxsize*2; T*brr=new T[maxsize](); for(int i=0;i a; vector b(a); a.inserttail(1); a.inserttail(3); a.inserttail(4); a.insertpos(2,1); b=a; a.show(); b.show(); }

以上のコードは、vectorコンテナでよく使われるメンバーメソッドを簡単に実現しています.不謹慎なところもあるかもしれませんのでご指摘ください