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函數
2.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標準模板庫簡介

發佈了77 篇原創文章 · 獲贊 7 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章