標(biāo)準(zhǔn)模板類庫容器類有兩種類型,分別是順序和關(guān)聯(lián)。順序容器提供對其成員的順序訪問和隨機(jī)訪問,關(guān)聯(lián)容器則經(jīng)過優(yōu)化關(guān)鍵值訪問它們的元素。
找出下面程序的錯誤:
class CDemo{
public:
CDemo() : str(NULL);
~CDemo(){
if(str) delete[] str;
}
public:
char* str;
}
void main(){
CDemo d1;
d1.str=new char[32];
strcpy(dl.str,"trend micro");
vector<CDemo>* a1=new vector<CDemo>();
a1->push_back(d1);
delete a1;
}
這個程序的錯誤在于delete a1時,會銷毀其中push的CDemo對象,而由于push_back(d1)時是淺賦值,即沒有開辟新的內(nèi)存保存d1.str的值,使得程序結(jié)束后,對d1.str執(zhí)行了兩次內(nèi)存釋放,造成delete同一片內(nèi)存,程序崩潰。解決這個問題的方法是定義CDemo類的一個深復(fù)制構(gòu)造函數(shù)。
//像下面那樣,當(dāng)erase當(dāng)前iterator指向的元素時,這個iterator就失效了,對其++或取值都會報錯。
vector<int> v;
v.push_back(1);
v.push_back(2);
vector<int>::iterator it=v.begin();
v.erase(it);
it++;
cout<<*it;
下面的代碼是使用函數(shù)指針完成給定的任務(wù),利用靜態(tài)模板類實現(xiàn)。
#include <iostream>
using namespace std;
template<class T>
class Operate{
public:
static T Add(T a, T b){
return a+b;
}
static T Mul(T a, T b){
return a*b;
}
static T Minus(T a, T b){
return a-b;
}
}
//使用時,如下
int a=19, b=1;
cout<<Operator<int>::Add(a,b);
常用的STL容器:
| 數(shù)據(jù)結(jié)構(gòu) | 描述 | 實現(xiàn)的頭文件 |
|---|---|---|
| 向量(vector) | 連續(xù)存儲的元素 | <vector> |
| 列表(list) | 由節(jié)點組成的雙向鏈表 | <list> |
| 雙隊列(deque) | 連續(xù)存儲的指向不同元素的指針?biāo)M成的數(shù)組 | <deque> |
| 集合(set) | 由節(jié)點組成的紅黑樹,每個節(jié)點都包含著一個元素,節(jié)點之間以某種作用于元素對的謂詞排列,沒有兩個不同的元素?fù)碛邢嗤拇涡?/td> | <set> |
| 多重集合(multiset) | 允許存在兩個次序相等的元素的集合 | <set> |
| 棧(stack) | 后進(jìn)先出的值的排列 | <stack> |
| 隊列(queue) | 先進(jìn)先出的值的排列 | <queue> |
| 優(yōu)先隊列(priority_queue) | 元素的次序是由作用于所存儲的值決定的一種隊列 | <queue> |
| 映射(map) | 由{鍵,值}對組成的集合,按鍵排序 | <map> |