1、演算法
脫離具體的語言
有窮性 --- 在保證執行有限步驟之後確定能夠結束
確切性 --- 每條語句具體幹什麼
輸入輸出 --- 所有的演算法都有輸出,列印螢幕,寫檔案,寫DB
2、快速排序法
資料個數超過一個,任選其中一個資料作為分界值,把其他資料按大小關係分為2組,分界值在中間
對兩組資料實行遞迴重組
View Code
//快速排序演算法,效率最高的排序演算法。第一個參數表示數組首地址,第二個參數表示數組起始位置,第三個參數表示結束位置 void mysort( int * p , int left , int right ){ int l = left ; //從左側開始走 int r = right ; //從右側開始走 int povit = p[(left + right)/2]; //把數組中間的一個資料作為分界點 do{ while( p[l]<povit && l < right ){ //迴圈退出,則是l找到一個比自己大的 l++ ; } while( p[r]>povit && r > left ){ r--; } if( l <= r ){ int t = p[l]; p[l] = p[r]; p[r] = t ; l++; r--; } }while( l <= r ); //條件就是左右的兩個人還沒有碰面 if( r > left ){ //只要右邊的仍比左邊的大,就要繼續迴圈 mysort( p , left , r ); } if( l < right ){ //只要左邊的仍比右邊的大,也要繼續迴圈 mysort( p , l , right ); } }
3、直接使用系統的qsort()函數
要自己定義一個定序
4、模版
(1)模版的參數至少出現一次,才能確定類型
(2)只能在緊跟的函數中使用,函式宣告緊跟在後面
聲明多個模版類型 template<class T1 , class T2>
class關鍵字不能省略
(3)對於模版類型的要求,要能重載">","<","="
建議:在編碼時能用一種運算子完成的操作,就不要使用多個運算子,避免多個重載
(4)用模版寫的函數叫函數模版
函數模版在調用的時候確定類型的
用模版寫的類叫類模版
資料類型,參數類型,函數傳回型別都可以使用模版
類模版不是類,是不完整的類
類模版要在聲明時用類名<int>指定,確定類型
(5)C++的泛型(模版)是編譯時間確定類型的 --- 效率
Java的泛型是運行時的
(6)模版類的聲明和定義(多檔案結構)是不能分開的
模版函數的聲明和定義是可以分開的 template<class T> 在標頭檔和實現檔案中都要出現
5、STL包含三大類,容器類(可以儲存其他對象的對象),演算法(一系列封裝好的函數),迭代器(用於遍曆操作的類)
容器可以直接儲存物件,也可以儲存物件的指標。成熟的程式員喜歡使用間接儲存。
容器主要包括兩種類型:序列類(一般是線形儲存)和關聯類別(一般是非線性儲存)。
vector ---- 數組 可變長 不提供pop_front()刪除頭元素的函數
list ----- 鏈表
(1)Vector v[1000]當越界的時候,會出現段錯誤
v.at(1000) 越界的時候,會拋出out_of_range的異常,在程式中捕獲 v.size() 返回長度,可利用這個迴圈迭代 v.empty()判斷容器是否為空白 Iterator迭代器 : 可以做取*操作 *iterator iter->name <=> (*iter).name iter++ v.begin() 指向數組的開始 v.end() 指向數組最後一個元素的後面,是一個結束標誌 vector<int> v1; vector<int>::iterator it; //iterator是vector的一個內部類 for( it = v1.begin(); it != v1.end(); it++ ) cout << *it << endl; v.insert(iter,5); //在iter所指的元素前面插入5 v.insert(iter,5,100); //在iter所指的元素前插入5個100 這樣的插入操作,會造成原來的iterator失效,對起重新賦值,可以保證繼續使用
(2)list
不能做at()
多了push_front(),pop_front()
iter不能做加n操作
使用於做頻繁的插入刪除操作
6、關聯式容器
(1)map
適合根據鍵尋找值的操作
儲存上按照索引值排序 ,並且key值唯一
map<int,Student> m; Student s( 1 ,"liucy" ); m.insert( map<int,Student>::value_type( s.getId() , s ) ) ; //建立一個pair,並存到map的第一個位置中 value_type是map的靜態函數 Student s2( 4, "tangliang" ); m.insert( map<int,Student>::value_type( s2.getId() , s ) ) ; map<int,Student>::iterator it ; for(it=m.begin();it!=m.end();it++ ){ cout<< it->first << " "<<it->second; cout<<endl ; }
在map中用[]查詢,並不安全
m.find(1); // 查詢key為1的value
返回一個iter,指向找到的那個索引值對,如果沒找到,iter會與iter.end()的值相等
(2)multimap
其中的key允許重複
尋找:multimap<int ,Student>::iterator it ; multimap<int ,Student>::iterator lt ; multimap<int ,Student>::iterator ut ; lt = m.lower_bound( 1 ); ut = m.upper_bound( 1 ); for( it=lt ; it != ut ; it++ ){ cout<<it->first <<" " ; cout<<it->second <<endl; }
(3)set
set中不能插入重複資料,相當於map中的key
插入資料的時候不必指定位置
因為與map中的key一致,仍保留著排序的特性
(4) multiset
與vector類似,唯一不同的就是保留著排序的特性
7、模版的聲明和實現都寫在標頭檔中
/usr/local/include/c++/3.2/