C++Primer 第9章 顺序容器
寫在前面
到了,看來侯捷老師的STL,我對C++的標準庫是有了極大的興趣的,本章主要講述的是標準庫中的順序容器的使用。
順序容器
首先什么是順序容器呢?是將數據以一定次序存儲在內存當中,其數據的順序不以元素的值確定先后。
那么順序容器都有什么呢:本書給出了以下6種容器:
其實這些容器知識在表層的描述,在這里再次安利一下侯捷的STL源碼剖析以及相關的課程,我后面也會再次研讀此書,在這里對這些容器的底層實現不做過多的介紹了
容器庫包含了什么呢?
其實一個標準的容器實現包含了六大部分:
容器,分配器,迭代器,算法,適配器,仿函數。
其中維護容器核心做到分配內存并且訪問元素的便是分配器與迭代器。
不同的容器有不同的迭代器,但是這些迭代器都具有相同的接口,使這些容器能夠做到統一標準,容器的結構不同,但是經過迭代器的包裝,使得我們在使用容器時可以使用同一種方法來進行數據的訪問。
分配器是容器在存入數據之前,向計算器申請的內存空間的方法,每一個容器都有自己默認的分配器,并且用戶不用自己指定,但是默認的分配器某些問題的快速分配內存,或者可能造成較大的內存冗余,比如默認的分配器在底層只是簡單的包裝了molloc,因為每次申請內存時都需要申請比你需要的更多的內空間,比如申請出的上下界各占4字節,debug模式之下還會有更多的消耗,因此在申請多次的小容量內存時,“垃圾的”內存消耗會很多很多。這時默認的分配器就不適用于這些內存的的分配,但是內存池便可以很好的解決“垃圾”內存的消耗,從而提高內存使用效率。不過各種類型的分配器都有他們各自的優勢與劣勢,良好的運用分配器會使得在使用標準庫時更加的高效。
迭代器是一種智能的指針,并且是泛型算法的基礎,不同的容器,其迭代器產生的接口是相同的,因此可以利用迭代器,實現對各種不同容器之間的互通。而對于容器自己,也可以通過迭代器使用公用的算法,畢竟大家標準都一樣嘛,所以可以上同一輛車,去同樣的地方,標準庫的這樣的設計,極大的降低了容器的靈活度,以及代碼的冗余。
對于容器而言,這其實就是數據結構的代碼實現,vector、array、string都是在內存處為連續的儲存空間,因此查找與頭部插入都會很快,deque雖然在表面上為連續的雙開口的隊列,但是在實現時,為了考慮到這個內存空間的限制,它在設計時則會進行“分段連續的存儲”,然后將各個隊列使用指針聯系起來,設計出deque特有的迭代器,在用戶使用時表面上看,這些數據是連續存儲的,實現在用戶階段的使用方便。
適配器,仿函數,算法,我認為是為了實現與使用容器的功能與一定聯通而存在的,以后細講。
順序容器功能概覽
上上節介紹了,我們擁有這些容器,他們都有各自的優缺點,他們之間也有很多共同的操作方式:
容器操作: iteraror 迭代器 const_irerator 只讀迭代器 size_type 容器大小 difference_type 迭代器距離 value_type 元素類型 reference 類似于左值 cnst_reference 類似于const左值 構造函數: C c 默認構造 C c(c2) 拷貝 C C(b1,b2) 迭代器初始化 C c{a1,a2...} 初始化列表初始化 大小: c.size() 存儲元素多少 c.max_size() 當前可存儲最大元素多少 c.empty() 是否存儲元素返回bool 添加刪除: c.insert(args) 拷貝 c.emplace(inits) 使用參數構造一個元素 c.erase(args) 刪除指定 c.clear() 清空容器內元素 關系運算符: ==,!= <,>,<=,>= 獲取迭代器: c.begin() c.end() c.cbegin() c.cend() 反向容器: reverse_iterator const_reverse_iterator rbegin,rend crbegin,crend當然各自不同的容器也有各自特別的功能,這個我們在下一節泛型算法當中繼續嘮嘮。
總結
以上是生活随笔為你收集整理的C++Primer 第9章 顺序容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android OpenGL ES视频渲
- 下一篇: 从头开始训练一个依存分析器