vectorもどき リファレンス
written by shinsuke okazaki since 2001 5/14

 

追加修正 2005 11/13

追加修正 2006 9/12

追加修正 2008 4/15

追加修正 2015 2/4

ホームページ:http://natsuhaze.jp/software/

 


概要

vectorもどきは C++コンパイラーに付属しているSTL (Standard Template Library)の動的な配列を意味するvectorを模倣したライブラリです。

STLのvectorより機能は限定されていますが、必要な機能は大体入っていると思います。

ソースコードの量が少ないので、巨大なSTLを使用するよりコンパクトになり、C++のテンプレートの学習にもよいかと思います。

ランタイムライブラリはrealloc()とfree() (Win32APIを使用するならHeapAlloc関連)のみ使用しているだけなので、Windows以外のOSでも少しの変更で簡単に移植できるかと思います。ver1.24以降はメモリ管理部分を切り離してメモリ管理クラスを設けましたので、そのクラスを変更したり新規に独自のクラスを作成するだけで各OSに対応させることができると思います。

このライブラリは作者に断りなく自由に変更して使用しても構いません。ただしこれを使用したことによる損害の補償は行いませんので十分なテストを行ってください。

vectorもどきは VisualStudio2013,2010, 6.0 とフリーソフトのBorland C++5.5でコンパイル確認、テストを行いました。ひさしぶりにBorlandのコンパイラを使用しましたが、やはり厳密なエラーチェックはBorlandの方が上ですね。Microsoftの方はとんでもないコードでもビルドしてしまう時があるので、できればボーランドの方でもチェックしたほうが、後で困らないでしょう。

Borland C++でテストプログラムをコンパイルするとインライン展開はできないと言う意味の警告が多数出てきますが、コンパイルは出来ます。(特別なキーワードをヘッダファイルに入れておけば警告は出ないのでしょうが、私は最新のC++の仕様は知りません)

 


使用上の注意

1 .関数の返り値は基本的に成功か失敗かを示す1か0になります。find()と演算子の定義やinsert_sorting(), bsearch()はそれぞれのリファレンスを参照。
2. クラスオブジェクトをvector()で使用する際、かならずそのクラスには==と=の演算子をオーバーロード(独自に再定義)してください。特に=のオーバーロードはそのクラスオブジェクトの初期化の意味も含まれます。これらの演算子のオーバーロードをしないとアプリケーションエラーが生じます。また、デフォルトのコンストラクタを作成する事もお忘れなく。
3. s_vectorは文字の配列用に設けたものです。s_vectorはクラスオブジェクトを想定していません。charなどの単純な型のみを想定しています。
4. s_vectorは終端文字を0と仮定しています。それを考慮していれば、s_vector<char> だけでなく、s_vector<int>などでも使用可能です。

5. クラスオブジェクトを使用する場合のクラス宣言では仮想デストラクタは使用できません。アプリケーションエラーが生じます。理由は不明です。わかる方は直して使ってください^^;

6.派生クラスは基本的に使用できませんが、=のオーバーロードを作成し、コンストラクタと同じ動作をするようになれば使用できるかと思います。(new演算子を使用できない、コンストラクタをじか呼び出しできないため。)

7._WINDOWSを#defineで定義してある場合はrealloc()ではなくWin32APIのHeapAlloc()を呼び出します。またWIN_DEFAULT_HEAPも一緒に定義されますが、このシンボルをコメントなどにして定義しないようにすると、個別にヒープハンドルを作成します(new_vector.hを参照)。独自にヒープハンドルを作成すると、メモリ割り当てのスピードが速くなる、バグを特定しやすくなるという利点があります(あくまで本の受け売り)。_WINDOWSを定義してある場合、デフォルトとしてはGetProcessHeap()関数を使用してハンドルを得ることになりますが、それはたぶんプロセスごとに必ず作成されるヒープハンドルで、ほかのプログラムも当然利用されているのでしょうから、ハンドルの内容を破壊された場合、確かにバグは特定しにくいでしょう。それにメモリ割り当て、開放も複数のプログラムのアクセスを考慮しなくてはならないので動作が若干遅くなるのでしょう。

仮想デストラクタが使用できない例:
class test_class{

  public:
  test_class(){};
  virtual ~test_class(){};// virtualがあるとだめ、virtualは派生クラスがあるとき意味があります。
};

void main()
{
vector<test_class> obj;
//デストラクタ呼び出し時にアプリケーションエラーが生じます
}

8.仮想関数があるクラスはvectorもどきで使う型として使用できません。どうしても使用したい場合はポインタ変数を使用してください.

 


 

コンストラクタ vector()

メモリの確保 reserve(),reisze(),inc_size()

メモリの開放 clear(),reset()

サイズの取得/設定 size(),capacity(),length()

反復子begin(),end()

値の代入 pus_back(),insert()

値の削除 erase()

演算子 operator+=, operator=, operator==, operator!=

値の検索 find(),findr()

2分探索(バイナリ サーチ)

sprintf()の模倣 format()

値の反転 reverse()

ソート ins_sort(),sort(),qsort()

更新履歴


 

コンストラクタ

vector() //デフォルト
vector( int init_size, int new_inc_size=INCREMENT_SIZE)
vector(const VEC_T &obj) //コピーコンストラクタ 。VEC_Tは vector<T> を意味する。 Tは任意の型。

s_vector()だけ(他はvector()と同じ)
s_vector(const T *obj)


vector<int> a;//デフォルト
vector<int> a(10);//int型の10個の配列を予め最初に確保する(ただしsize()の返す値は0)
vector<int> a(10,4);//int型の10個の配列を予め最初に確保し、でメモリの拡張は4個ずつ

vector<int> b(10);
vector<int> c(b);//cを初期化してbの内容をコピーする。
vector<int,NV_Windows_VirtualAlloc> a; //Win32のVirtualAllocを 使用したメモリ確保。メモリ管理クラスはNV_Windows_VirtualAllocの定義を真似て独自のものを設定できます。

s_vector<char> str("first string");//strを初期化後、"first string"という文字列を代入する。

元に戻る


メモリ確保

reserve(int size,int new_inc_size = INCREMENT_SIZE)
少なくとも size個の配列を確保する。new_inc_sizeはpush_back()などで使用する増分サイズ

int set_size(int new_size)

resize(int new_ size)

 

int set_size(int new_size)は、現在メモリ割り当て可能な範囲内(capacity()の返り値)でサイズを指定する。new_sizeがそのサイズを超えていると0を返す。s_vector<>には無い。

resize(int new_size)は、少なくとも new_size個の配列を確保し、size()でnew_sizeを返すようになる。
以前のサイズより少ない数を指定した場合は、sizeより多い分のメモリの内容をデストラクトする。
(割り当てられている配列のメモリサイズはそのまま)

inc_size(int size,char is_stl_compatible=0)

size :メモリ拡張が必要になったときの増分サイズ
is_stl_compatible:1にするとSTL本来のように元のサイズの2倍、4倍というメモリ拡張をする
ただし、このパラメータはコンパイル時にシンボル__STL_COMPATIBLE_REALLOCを定義しないと有効でない。

メモリ確保する関数をカスタマイズできます。(メモリマネージャをカスタマイズできます)

詳しくはヘッダファイルのtemplate<class T> class NV_default_mem_alloc を参照してください。

元に戻る


メモリ開放

clear() 割り当てられたすべてのメモリを開放する
reset() vector内にあるクラスオブジェクトの内容をデストラクトしてsize()が返す値を0にする。

reset()はオリジナルのSTLのclear()と同義である。intなどの単純な型の配列の場合、単にsizeを0にするだけである。


元に戻る


サイズの取得/設定

size()    配列の個数を返す
capacity()  割り当てられた配列の個数を返す
length()   終端文字までの個数を返す(strlen()) s_vector()のみ


以下の2つは主にvectorもどきのポインタを引数としてCのAPI関数を使用した後に使用します。

(API関数を呼び出す前に、必ずreserve()してメモリを確保してください。)


vector::set_size(int new_size) サイズを設定する

int s_vector::set_length( int r) 文字列の長さを決定する

元に戻る


反復子など


typedef T *iterator; //反復子. vectorもどきではポインタである
typedef T &reference; //参照
typedef const T *const_iterator; //read onlyの反復子
typedef vector<T> VEC_T; // T 型のvectorを意味する。

(一応テンプレート定義を知らない方のために断っておきますが、Tは任意の型です。
TがcharならVEC_Tは vector<char>と同じです)
本物のSTLはどういう実装になっているか詳しくはしらないが、vectorに限って言えばiteratorはポインタと同じものとしてとらえて問題ない。vectorもどきでは完全にそれはポインタである。
したがって、以下の定義は同じである。

vector<int>::iterator p;
int *p2;

iterator begin(); //配列の最初の反復子を返す。
iterator end(); //配列の内容が格納されている最後の反復子の次の反復子を返す

ヘッダファイルを見ればどのような実装になっているかすぐにわかると思います。

元に戻る


値の代入

int push_back(const T &obj)

配列の最後にobjを追加する。成功した場合1を返す。

元に戻る


値の挿入


int insert(iterator ptr,const T &val)
int insert( int i,const T &val)
int insert(iterator ptr,const_iterator s,const_iterator e)
int insert(int i,const VEC_T &a)
T * insert_sorting(const T &val, int( *compare) (const T &e1,const T & e2), int replace=0 ) //ソートしながら挿入 


s_vector<>では以下の2つのみ
int insert(iterator ptr,const_iterator s)
int insert(int i,const VEC_T &a)


ptr:挿入するvector()の反復子。ptrの前に値を挿入する。
val:挿入する値
s,e: 挿入元の別のvectorの挿入開始と終わりの反復子。
i: 挿入するvectorの配列変数としてみた場合の配列の添え字。
a: 挿入元の別のvector
compare:  比較関数のポインタ。
replace: 同じ値が既にあった場合の動作。(1:置き換える 0:関係なく挿入する)

成功した場合1を返す。(insert_sortingの場合は挿入した個所を返し、NULLの場合は失敗)

insert_sorting()は、既にソートしてあるデータにソートをしてデータを付け加えるときに使用してください。ソート関数を使った場合だと、既にソートしてあるデータに新たにソートされていないデータを加えてソートを行うとqsort()などのソート関数は遅くなります。逆に空の状態からこの関数を使ってソートしながら値を代入すると非常にスピードが遅くなります。この関数を使う場合は、空のデータか、既にデータがソートされている必要があります。insert_sorting()は2分探索をして挿入個所を決めてから挿入します。

insert_sorting()の比較関数は(もし使用するのであるなら)bsearch()で使用する比較関数と同一にしてください。

 

元に戻る


値の削除

void erase(iterator obj)//objが指す値を削除する
void erase(int i)// 配列の添え字を示すiが指す値を削除する
void erase(iterator s,iterator e)//sからe-1まで指す値を削除する.
void erase(int s, int e) //配列の添え字を示すsからe-1まで指す値を削除する.

元に戻る


演算子のオーバーロード


const VEC_T& operator+=(const VEC_T & _X)
const VEC_T& operator=(const VEC_T & _X)
int VEC_T& operator==(const VEC_T & _X)
int VEC_T& operator!=(const VEC_T & _X)

例:
void main()
{
vector<int> a(10),b(10),c;

//値を代入するコードがあるとする

if(a==b){ }
c = a; c+=b;
if(c != a){ }
}

以下はs_vectorのみ
int VEC_T& operator==(const T * _X)
int VEC_T& operator!=(const T * _X)
const VEC_T& operator+=(const T * _X)
const VEC_T& operator=(const T * _X)
VEC_T s_vector<T>::operator +(const s_vector<T>:: &vec1)
VEC_T s_vector<T>::operator +(const T* vec1)


例:
void main()
{
s_vector<char> a(10),b(10),c;

//値を代入するコードがあるとする

if(a== "*** string **** "){

}

c = a; c+=b;
c += "**string 2***";
if(c != a){

}

元に戻る

 


vector内の検索

T *find( VEC_T &s,iterator start_idx=NULL) // strstrに相当
T *find(const T &s,iterator start_idx = NULL) // strchrに相当
T *findr(const T &s,iterator start_idx = NULL) // strrchrに相当

s_vector()の宣言では以下の通り
T *find(const T *s,iterator start_idx=NULL) const// strstrに相当
T *find( VEC_T &s,iterator start_idx=NULL) const// strstrに相当
T *find( T s,iterator start_idx = NULL) const// strchrに相当
T *findr(T s,iterator start_idx = NULL) const// strrchrに相当
T *findr(VECT_T &s,iterator start_idx = NULL) const//後方から合致するsを検索
T *findr(T s*,iterator start_idx = NULL) const//後方から合致する配列sを検索

以下の2つは、大文字小文字は区別無し。T = wchar_t(UNICODE,UTF16)のみ有効

T* s_vector<T>::findi(const T *_X,iterator start_idx=NULL)// strstrに相当
T *s_vector<T>findir(const T *s,iterator start_idx=NULL)  //後方から合致する配列sを検索


基本的にはCのランタイム関数のstrstr(),strchr(),strrchr()と同じような動作を行う。
もちろんchar型に限ったものではない。
基本的に第1引数は検索するオブジェクトもしくはオブジェクトの配列を指定し、第2引数は検索開始する反復子を指定する。第2引数を記述しない場合は、最初(findr()の場合最後)から検索開始する。
返り値は、検索に該当する最初のポインタ(反復子)を返す。見つからない場合はNULLを返す。
既にソートされたデータを高速に探索するbsearch()も参照してください。

元に戻る


sprintf()の模倣

int s_vector<char>::format(const char*format,...)

int  s_vector<wchar_t>::format(const wchar_t *_format, ...) //UNICODE設定時

s_vector<>::formatA(const char *_format, ...)  //Tがどのような型でもchar型を選択
s_vector<>::formatW(const wchar_t *_format, ...) //Tがどのような型でもwchar_t型を選択


sprintf()と同じ動作をします。ただし、s_vector<char>もしくはs_vector<wchar_t>と宣言した場合有効になります。
Windowsを使用しない設定の場合、vsprintf()もしくはvswprintf()を使用します。

Windowsを利用している場合はStringCchVPrintf()を使用します。

元に戻る


配列の内容の反転

void reverse(iterator begin_i = NULL,iterator end_i = NULL )

配列の内容の並びを反転します。すべての内容を反転するなら引数は何も指定しなくても構いません。

 

元に戻る


ソート

void vector<class T>::sort(int (*comp_func)(const T & elem1, const T & elem2),
int starti=0,int endi=0)

クイックソート

void vector<class T>::qsort(int (*comp_func)(const T & elem1, const T & elem2),
int starti=0,int endi=0)

 

挿入ソート

void vector<class T>::ins_sort(int (*comp_func)(const T & elem1, const T & elem2),
int starti=0,int endi=0)

 

comp_func:比較関数(bsearch(),insert_sorting()使用時、共用可)

starti:ソート開始インデックス。

endi:ソート終了インデックス。この値がゼロだと項目の最後を指す。 endi>startiでなくてはならない。

 

sort()はqsort()にinc_sort()を足した物です。ソート数が少ないとins_sort()を行うことでスピードを上げます。

sort()はqsort()の処理時間に比べて8割から9割程度の時間でソートします。

inc_sort()は既にソートしたデータにソートしてないデータをいくつか追加後にソートする際、sort()より高速に動作します。

テストプログラムでは40個未満の未ソートデータを加えた時に有効でした。

これらの関数はCのRuntimeを呼び出していません。検索コードの本体が直接ヘッダファイルに書き込まれています。

s_vector<>にはありません。

元に戻る


既にソートしてあるデータを2分探索(バイナリ サーチ)

T * vector<class T>::bsearch(const T &key, int( *compare)(const T &element1,const T & element2),T **near_pt=NULL )

key:サーチするデータ

compare:比較関数のポインタ

near_pt: 返り値の次にkeyの値に近い検索結果が入る。返り値がNULL(該当するデータがない)時に、それに一番近いデータを得る時に使用。

 

この関数は2分探索を行います。このアルゴリズムは簡単に言えば、辞書の単語を調べる時、一番最初に真中のページを見て、その中に目的の単語が左のページにあるなら、次に左半分のページだけを見て、その左半分のページの半分のページ位置にある単語を比較していくというやり方で目的のデータを探す方法です。この例で単語が左が右にあるかの判定は比較関数(compare)で行ないます。例えば辞書データなら比較関数の中身は return strcmp(element1,element2)でOKです。

この関数はfor文を使用したシーケンシャルなサーチよりはるかに高速で(テストプログラムによれば、100個のデータなら最高7回の比較関数を呼び出すことで目的のデータを探せる。1000個なら最高10回)、。比較関数はbsearch(), insert_sorting()で共用できます。また、C言語の教科書に出ている構造体の自己参照ポインタを使用したバイナリツリーを形成する2分探索より検索時間は安定しており、場合によって大幅な時間がかかるような事はありません(ただしデータ挿入時は既にあるデータ数が多い程バイナリツリーを形成するものより時間がかなりかかる。)。上記のバイナリツリーを形成するものは、挿入するデータによって、ツリーが一本のツリーになることがあり、検索時間がシーケンシャルな検索時と同じになる時があります。

この関数はCのRuntimeを呼び出していません。検索コードの本体が直接ヘッダファイルに書き込まれています。

元に戻る


 

更新履歴

2015 1/31 ver1.45 s_vector<>::push_back()を追加。
2014 2/3 ver1.44 s_vector<>::set_new_size()をprivateからpublicに変えた。
2014 1/21 ver1.43 operator[] をテンプレート関数にして、すべての整数型に対応した定義をいちいち書くのをやめた。
2014 1/21 ver1.42 s_vector<>::format()をStringA使用時でも使用可能に。
デフォルトの文字コードに関係なく指定の文字コードでformat出来るformatA()(SJIS,ANSI版),formatW()(UNICODE版)を追加
2014 1/20 ver1.41 UNICODEが定義されていてもchar型のformat()を可能にするためs_vector<>::formatA()を定義
2013 12/25 ver1.4 StringWの定義をtypedef vector_modoki::s_vector<wchar_t> StringW;に変更

2012 10/7 ver1.39 vector<T>::reserve()に第二引数を追加。増加サイズを指定
2012 7/9 ver1.38 s_vector<T>::find()関連関数をconstにした。その関係上is_changed変数を廃止 
ユーザが直接ポインタ変数を操作しサイズ変更したあと、
文字列の参照、検索関連関数を使う時はその前に明示的にset_new_size()を呼び出す必要あり
2009 3/14 ver1.37 ソート関数の比較関数にデフォルト引数として昇順ソート関数を追加。降順ソートもクラスに追加
2009 2/5 ver1.36 __MemMove()の第3引数を廃止

2008 4/16 ver1.35 vec.cppコンパイル時vector::find(const VEC_T &s,iterator start_idx=NULL)でエラーが起こったので第一引数部分をキャストして回避
2007 10/24 ver1.34 vector::set_size(int new_size)を追加。CのAPIなどに直接ポインタを直渡しで値を直接代入させた後、サイズを決定させるため
2007 10/24 ver1.33 ”デバッグ゙情報で識別子が 255 文字に切り捨てられました”を消す #pragma warning( disable : 4786 )を追加
(VC++ only)
using namespace vector_modokiで囲った
2007 9/20 ver1.32 T& operator[]のAssertM式のsize()をcapacity()に変更
2007 9/13 ver1.31 s_vector<T>::toupper(),s_vector<T>::tolower()を追加((T=unsignd shortのみ有効))

2007 9/10 ver1.30 T *s_vector<T>findir(const T *s,iterator start_idx=NULL)を追加(T=unsignd shortのみ有効)
2007 6/21 ver1.29 s_vector<T>::format()で、Windows版の時はStringCchVPrintf()をwsvprintfの代わりに使用
2007 3/19 ver1.28 s_vector<T>::resize() s_vector<T>::set_length()のメモリ最確保コードにバグがあったのを修正
直接Realloc()を呼び出すのではなく、reserve()を呼び出すようにした
2007 3/14 ver1.27 int vector<T>::resize()に初期化する値を入れる第二引数(const T*)を追加
2007 2/20 ver1.26 T* s_vector<T>::findi(const T *_X,iterator start_idx=NULL)
VEC_T s_vector<T>::operator +(const s_vector<T>:: &vec1)
VEC_T s_vector<T>::operator +(const T* vec1)を追加
2006 9/1 ver1.25 sort()をC Runtimeを使わないでクイックソート+挿入ソートとした。
挿入ソートを行うins_sort()も新設
挿入ソートは既にほとんどソートされているデータには早いと言われる。
また、ソート数が少ない場合もクイックソートより早いと言われる。
この変更によりclass hayasiで使用するソート関数を変更
2006 8/26 ver1.24 メモリ管理クラスを設けて、メモリ管理はvectorテンプレートから切り離す.
vector<T>::Realoc()とvector<T>::clear()のみ書き換え
これは、Win32のVirtualAllocが必要なために設けた。
allocatorクラスは変数は基本的に1つもないから
(プライベートヒープを使う場合は1つ)
若干の負荷か..

2006 8/8 ver1.23 UNICODEでビルドする場合Stringはs_vector<unsigned short>にした。
format()をCランタイムが無くても実行可能に
(ただし、stdarg.hはインクルード.これはマクロと構造体の定義で使用)
2006 5/3 ver1.22 is_stl_compatible_reallocが実質意味がないので削除。
HeapCreateの初期サイズをGetSystemInfo()から取得

2006 4/24 ver.1.21 class queueを追加。これはvectorを継承しただけのもので基本的な機能しかない。
2006 4/5 ver.1.2 ハッシュデータを実現するclass hayasiを追加。マルチスレッド時のクリティカルセクションを追加

2005 11/13 ver1.18 qsort()(正確には_qsort2())にバグがあったのを修正。ちゃんとソートしていなかった
2003 10/25 ver1.17 bsearch()に引数を追加。検索した値がない場合、一番近い値を追加した引数に代入
2003 4/10 ver1.16 s_vector<>::reverse()を追加

2003 2/16 ver.1.15 push_back()のAssertM()の評価式が間違っていたのを修正。
vector<>::resize()で配列を拡張する時、デフォルトのコンストラクタを
呼び出していなかったのを修正(今までは単純に0クリアしていただけだった)
2003 2/9 ver1.14 s_vector<>::set_length()追加 (テストはしていない)

2003 1/16 ver1.13 デバッグモードでpush_back()の引数のアドレスチェックを追加
                            (詳しくはpush_back()のコードコメント部分参照)
2003 1/9 ver1.12 s_vector<class T>::erase(iterator s,iterator e)に数え間違いがあったのを修正

                              set_new_size();の前にis_changed=1;を最後に追加

2002 11/22 ver1.11 s_vector<class T>::erase(iterator s,iterator e)に数え間違いがあったのを修正


2002 11/9 ver1.1 vector<class T>::insert_sorting()の返り値を返すようにした。インサートしたオブジェクトを返す。

2002 11/4 ver1.10 vector<class T>::erase(iterator)にバグを発見。修正。
erase(iterator s,iterator e),insert(iterator ptr,const_iterator s,const_iterator e)は
_DEBUGがONのときAssertで引数をチェックしてリリースバージョン
ではそのコード無くすようにした。(以前はAssertでチェックする部分が否なら0を返すようにしていた)

erase()はそれに伴い、返り値はなくしてvoidとした。

insert()はメモリ確保失敗の有無が返り値になった。

MemMove()は各クラスのプライベート関数にして名前を__MemMove()とした。
またvector<class T>::erase(iterator s,iterator e)の一部の処理を__MemMove()に肩代わりさせた。


2002 10/22 ver1.09 vector<class T>::qsort()を追加。(これはC Rutimeを使用しない)

bsearch()とinsert_sorting()の基本コードを共通化(_bsearch2()に集約)

2002 10/18 Ver1.08 vector<class T>::bsearch() (バイナリサーチ)
vector<class T>::insert_sorting() )ソートしながら挿入)を追加

2002 9/18 Ver1.07 int s_vector<class T>::erase(iterator s)が実装されていなかったので付け加えた。

                          BorlandC++でコンパイルしてわかったのだが、何でVC++はこういうとんでもないところを

                            見逃すのか..

                          (最新版ならエラーチェックは強化されていると思うが。VC++5.0は初めてMicrosoftが

                           テンプレートをサポートしたコンパイラだからなあ)
2002 9/9 Ver1.06 1. MemMoveがクラスオブジェクトに対応していないので、自作した。
                           これは今までinsert(),erase()がクラスオブジェクトに対応していないことを意味する。
                           (今までMemMoveはmemmoveやMoveMemoryを呼び出していただけに過ぎなかった)
                         2. erase(),insert()関数を全面作り直し。引数が違うこれらの複数の関数も最終的に
                            それぞれ1つの関数が行うようにしてオブジェクトコード量を削減

2001 9/20 ver1.05 []のオーバーロードでデバッグバージョン(_DEBUGを定義した場合)のときassertで
                          割り当て以外のメモリを参照しようとした場合エラーが出るようにした。(buffer over runの回避)
2001 8/10 ver1.04 s_vector<>::format()の修正。内部で強制的にバッファを拡張(512Bytes)
2001 8/5 ver1.03 HeapCreate()を使用するバージョンも追加、[]のオーバーロードの追加 
2001 7/6 ver1.02 Windows環境ならWin32の関数を直接呼び出すようにした。(元に戻すことも可能)
2001 6/1 ver1.01
              s_vector<T>::count_size()にバグ
              vector<T>::reverse()の追加
             vector<T>::sort()の追加
             s_vector<T>::findr(const T s*,iterator start_idx=NULL); と、
             s_vector<T>::findr(VECT_T T s&,iterator start_idx=NULL);の追加(合致する配列を配列の後方から検索)
他、細かい修正

元に戻る