C++標準テンプレートライブラリSTL学習


STLは、すべてのC++コンパイラとすべてのオペレーティングシステムプラットフォームでサポートされているライブラリで、すべてのC++言語コンパイラとすべてのプラットフォーム(Windows/Unix/Linux...もちろん標準的にテンプレートライブラリの中のすべてのアルゴリズムを調べて、自分でC/C++で実現することができて、ただSTLはすでにカプセル化したライブラリで、その実現の細部がすでに多くの最適化をしたことを説明して、自分で書いたのはライブラリの中の効率より高いとは限らなくて、それではどうして機械の試験問題の中で、更に自分でアルゴリズムを実現することに偏っていますか?主に言語の使用技術と常用アルゴリズムの原理に対する理解を考察する.
上机题の中で、普通はすべてC言语の使用の熟练の程度を考察することに重点を置いて、C言语もプラットフォームにまたがって、もっと下の段阶のいくつかのため、Cの実行効率とプログラムの占有空间が小さいため、C言语はいつも埋め込み式のプログラムの设计の中で使います.C++標準テンプレートライブラリで実現する学生はめったに見られませんが、実はテーマにはC++標準テンプレートライブラリを使用できないことが要求されていません.C++STLを採用すると、時間を大幅に節約できます.STLにはよく使われるアルゴリズムがたくさんパッケージされているので、sortソートなど、直接持ってきて使うことができます.
前にvectorコンテナとsortソートを使用したことがあります.これらはSTLのもので、vectorは動的配列を実現しやすく、以前のC言語で動的配列を実現するのに先に空間を割り当てるのではなく、最後に空間を解放するのが面倒で、vectorコンテナはこれらの細部に対してすでにパッケージされており、ユーザーに対して透明であり、これらの細部は管理されていません.
次に、標準テンプレートライブラリのコンテナであるスタックを使用して文字列四則演算を実装します.たとえば、「1+4*5-8/3」と入力し、出力結果は19です.
この問題で最も一般的な方法はスタックで実現することです.以下はサンプルコードです.
#include <iostream>
#include <stack>
using namespace std;


//         ,     ,         '='
//           
char optCompare(char a,char b){
	if(a=='+' || a=='-'){
		if(b=='+' || b=='-'){
			return '>';
		}else{
			return '<';
		}
	}else{//  a */,  b        ,  >
		return '>';
	}
}

int compute(int x,char optr,int y){
	int ret;
	switch(optr){
		case '+':
			ret=x+y;
			break;
		case '-':
			ret=x-y;
			break;
		case '*':
			ret=x*y;
			break;
		case '/':
			ret=x/y;
			break;
	}
	return ret;
}
//   
void main(){
	stack<int> dat;//    
	stack<char> optr;//    
	string str="1+4*5-8/3";
	for(int i=0;i!=str.size();i++){
		if(str[i]>='0' && str[i]<='9'){
			dat.push((int)str[i]-48);//         
		}else{
			if(optr.empty()){
				optr.push(str[i]);
			}else{
				if(optCompare(optr.top(),str[i])=='<'){
					optr.push(str[i]);
				}else{//        ,          
					int a=dat.top();
					dat.pop();
					int b=dat.top();
					dat.pop();
					dat.push(compute(b,optr.top(),a));
					optr.pop();
					optr.push(str[i]);
				}
			}
		}
	}
	while(optr.empty()==false){//      
		int a=dat.top();
		dat.pop();
		int b=dat.top();
		dat.pop();
		dat.push(compute(b,optr.top(),a));
		optr.pop();
	}
	cout<<"the result is "<<dat.top()<<endl;
}

もちろんこの問題はスタックのデータ構造を自分で定義して実現することもでき,stackコンテナを直接使用するのは明らかに簡単である.
以下の参考資料詳細節では、C++標準テンプレートライブラリを紹介し、後で使用するときに調べるようにします.
1.http://www.sgi.com/tech/stl///STL公式サイトでは、API関数を直接調べることができます.http://net.pku.edu.cn/~yhf/UsingSTL.htm
3.http://morningspace.51.net/resource/stlintro/stlintro.html
4.http://blog.csdn.net/zlgrj1986/article/details/2252787
5.http://www.cnblogs.com/shiyangxt/archive/2008/09/11/1289493.html
6.http://www.vckbase.com/document/viewdoc/?id=1461
7.http://www.linuxsir.org/bbs/showthread.php?threadid=86454//Linux上のC++STL標準テンプレートライブラリの概要