容器,置物之所也!研究資料的特定排列方式,以利於搜尋或排序或其它特殊目的,這一專門學科我們稱為資料結構(data structures)。容器即是運用最廣的一些資料結構實現出來的!常見的資料結構有陣列(array)、鍊錶(list)、堆疊(stack)、佇列(queue)、樹(tree)、雜湊表(hash table)、集合(set)、對映表(map)等等,根據「資料在容器中的排列」特性,這些資料結構分為序列式(sequence)和關聯式(associative) 兩種。容器也有順序容器和關聯容器。
vector和array(陣列)十分相似,唯一區別就是vector是動態實現的,而陣列是靜態空間!vector的實現主要目的是實現對其大小的控制和重新配置時的資料移動效果.為了降低空間配置時的速度成本,vector實際配置的大小可能比客戶端需求量更大一些,以備將來可能的擴充。這便是容量(capacity) 的觀念。換句話說,乙個vector的容量水遠大於或等於其大小。一旦容量等於大小,便是滿載,下次再有新增元素,整個vector 就得另覓居所,見圖4-2。運用start, finish, end of storage三個迭代器,便可輕易地提供首尾標示、大小。容量、空容器判斷、注標([ ])運運算元、最前端元素值、最後端元素值等等機能。
具體實現如下:
template//根據使用者的型別進行模板例項化
class vector
~vector() //析構函式
void push_back(t val) //尾插
void insert(int pos, t val) //按位置插入
if (full())
for (int index = cursize; index > pos; index--) //後移資料
parr[pos] = val; //新增資料
cursize++; //更新有效位置
} t back() //獲取最後乙個元素
return parr[cursize - 1];
} bool empty() //判空
void pop_back() //尾刪
void erase(int pos) //按位置刪除
for (int index = pos; index < cursize - 1; index++) //資料前移
cursize--; //有效位置前移
}private:
bool full() //判滿
void resize() //擴容
t* parr; //通過棧上記憶體管理堆上的記憶體
int cursize; //當前有效元素個數,也可以理解為下乙個可插入元素的下標位置
int totalsize; //總的元素個數 ,相當於陣列的長度,即陣列的格仔數
};
與vector的連續線性空間相比,list顯得更加複雜,它的好處是刪除,新增乙個元素或刪除乙個元素,就配置或釋放個元素空間。因此,list對於空間的運用有絕對的精準,一點也不浪費。而且,對於任何位置的元素插人或元素移除,時間複雜度都是o(1)。stl的底層對於list的實現是用雙向鍊錶完成的!具體實現如下:使用單鏈表實現
templateclass clink;
templateclass node //結點
;templatenode::node(t val) :mdata(val), pnext(null) //結點建構函式
templateclass clink
;templateclink::clink() //建構函式
templateclink::~clink() //析構函式
phead = null;
}templatevoid clink::inserthead(t val) //頭插
templatevoid clink::inserttail(t val) //尾插
ptail->pnext = pnewnode;
}templatevoid clink::insertpos(int pos, t val) //按位置插入
node* pnewnode = new node(val); //建立新結點並初始化
pnewnode->pnext = pfront->pnext; //新結點先連線
pfront->pnext = pnewnode; //再指向新結點
}templatevoid clink::deletepos(int pos) //按位置刪除
node* pfront = phead; //標記頭結點
while (pos-- != 0) //0 1 //找位置
node* pcur = pfront->pnext; //標記要刪除的結點
pfront->pnext = pcur->pnext; //斷開結點
delete pcur; //釋放結點
}templatevoid clink::show() //列印
std::cout << std::endl;
}templatebool clink::empty() //判空
list的使用
int main()
std::list::iterator it = lt.begin();
while(it != lt.end())
std::cout << std::endl;
lt.pop_back();
lt.pop_front();
return 0;
}
C STL庫 之順序容器vector的使用
一 特點 總的來說 可變大小陣列。支援快速隨機訪問。在尾部之外的位置插入或刪除元素可能很慢 元素儲存在連續的記憶體空間中,因此通過下標取值非常快 在容器中間位置新增或刪除元素非常耗時 一旦內從重分配,和原vector相關的指標,引用,迭代器都失效。記憶體重分配耗時很長 二 標頭檔案 using宣告 ...
c STL容器之map容器
1.map中所有的元素都是pair 2.pair元素中第乙個元素為key,第二個元素為value 3.所有元素都會根據鍵值自動排序 4.map中不允許有重複的鍵,multimap中允許有重複的鍵 優點 可以根據key快速的找到value 一 建構函式 mapmp map const map mp 二...
c STL容器之deque容器
deque是雙端陣列。deque和vector的區別 deque內部工作原理 deque內部有個中控器,維護每段緩衝區中的內容,緩衝區中存放著真實資料。中控器維護的是每個緩衝區的位址,使得使用每個deque時像一塊連續的記憶體空間。deque容器的迭代器是支援隨機訪問的。一 deque建構函式 de...