STL和c++標準庫
標準模板庫STL部分包含在C++標準庫中的軟體庫,
c++標準庫:即以std::開頭,但是部分編譯器廠商也會把STL的內容放在std:: namespace里面
由于一個常見的誤解,您可能會將C++標準庫視為“STL”,或者將工具鏈中C++標準庫的實作部分視為“STL實作”,
事實并非如此,
MSVC ++和GCC(作為編譯器特定的擴展實作)都將其放在std命名空間中也是非常可惜的,這不僅具有高度誤導性,而且根據標準也是非法的,
為什么c++的名詞會這么混亂?
因為c++委員會制定標準,各家編譯器廠商實作標準(gcc,msvc)
vector
類似于C#中的List,長度會自動擴容(2倍擴容),普通的陣列需要初始化長度,
vector容器是支持隨機訪問的,即可以像陣列一樣用[]來取值,但不是所有的STL容器都有這個特性!
| 用法 | 作用 |
|---|---|
| vec.begin(),vec.end() | 回傳vector的首、尾迭代器 |
| vec.front(),vec.back() | 回傳vector的首、尾元素 |
| vec.push_back() | 從vector末尾加入一個元素 |
| vec.size() | 回傳vector當前的長度(大小) |
| vec.pop_back() | 從vector末尾洗掉一個元素 |
| vec.empty() | 回傳vector是否為空,1為空、0不為空 |
| vec.clear() | 清空vector |
queue佇列
先進先出,沒有clear,也不支持遍歷
檔案:std::queue - cppreference.com
| 用法 | 作用 |
|---|---|
| q.front(),q.back() | 回傳queue的首、尾元素 |
| q.push() | 從queue末尾加入一個元素 |
| q.size() | 回傳queue當前的長度(大小) |
| q.pop() | 洗掉首個元素 |
| q.empty() | 回傳queue是否為空,1為空、0不為空 |
stack
后進先出
| 用法 | 作用 |
|---|---|
| st.top() | 回傳stack的堆疊頂元素 |
| st.push() | 從stack堆疊頂加入一個元素 |
| st.size() | 回傳stack當前的長度(大小) |
| st.pop() | 從stack堆疊頂彈出一個元素 |
| st.empty() | 回傳stack是否為空,1為空、0不為空 |
string 容器
string是C++風格的字串,而string本質上是一個類
string和char * 區別:
- char * 是一個指標
- string是一個類,類內部封裝了
char*,管理這個字串,是一個char*型的容器
string特點:
string 類內部封裝了很多成員方法,例如:查找find,拷貝copy,洗掉delete 替換replace,插入insert
string管理char*所分配的記憶體,不用擔心復制越界和取值越界等,由類內部進行負責
匯入:#include
<string>// 注意這里不是string.h,string.h是C字串頭檔案
| 用法 | 說明 |
|---|---|
| int find(const string& str, int pos = 0) const; | 查找str第一次出現位置,從pos開始查找 |
| int compare(const string &s) const; | 字串比較是按字符的ASCII碼進行對比,回傳值:0:=,1:>,-1:< |
| string& insert(int pos, const string& str); | 插入字串 |
| string& erase(int pos, int n = npos); | 洗掉從Pos開始的n個字符 |
| char& operator[](int n);char& at(int n); | 獲取單個字符 |
| string substr(int pos = 0, int n = npos) const; | 回傳由pos開始的n個字符組成的字串 |
參考資料:
C++ string容器_Brave Seeker的博客
\0:是一個空字符,在cout中輸出是空的,表示字串的結束
string轉成char*
string str;
const char *c = str.c_str();
char*轉成string
string str;
const char *pc = "Hello World";
str = pc;
char[]轉成string
char ch [] = "ABCDEFG";
string str(ch); //也可string str = ch;
print中注意事項
string str="hello";
printf(“%s\n”, str); //此處出現錯誤的輸出
cout<<str<<endl;
用printf(“%s”,str);輸出是會出問題的,這是因為“%s”要求后面的物件的首地址,但是string不是這樣的一個型別,若一定要printf輸出,那么可以加上.c_str(),
map
map使用紅黑樹實作,查找時間在O(lg(n))-O(2*log(n))之間,構建map花費的時間比較長
c++中的map是有序的?我使用過其它語言map都是無序的,經測驗確實是有序的
map中獲取某個值的方法:find,然后再通過first,second來取key和value
map和multimap應該使用那一個?
在專案代碼中multimap會多一些
hasp_map
hash_map是 STL 的一部分,但不是標準C++ (C++11) 的一部分,在標準C++中,有一個名為“std::unordered_map”的功能類似unordered_map實作:http://www.cplusplus.com/reference/unordered_map/unordered_map/
C++11 引入了 std::unordered_map和hash_map沒有什么不同,
參考資料:https://stackoverflow.com/questions/5908581/is-hash-map-part-of-the-stl
該用hash_map還是map?
hash_map 查找速度會比map快,而且查找速度基本和資料資料量大小,屬于常數級別;而map的查找速度是log(n)級別,并不一定常數就比log(n)小,hash還有hash函式的耗時,明白了吧,如果你考慮效率,特別是在元素達到一定數量級時,考慮考慮hash_map,
但若你對記憶體使用特別嚴格,希望程式盡可能少消耗記憶體,那么一定要小心,hash_map可能會讓你陷入尷尬,特別是當你的hash_map物件特別多時,你就更無法控制了,而且hash_map的構造速度較慢,
來源:C++ map和hashmap用法_qq_33216029的博客-CSDN博客_c++ hashmap
set
set容器,有點像C#中的hashset,里面的元素是唯一不重復的,且內部排好序(升序排列),
set容器自動有序和快速添加、洗掉的性質是由其內部實作:紅黑樹(平衡樹的一種)
| 用法 | 作用 |
|---|---|
| s.empty() | 當前集合是否為空,是回傳1,否則回傳0. |
| s.size() | 當前集合的元素個數 |
| s.clear() | 清空當前集合 |
| s.begin(),s.end(); | 回傳集合的首尾迭代器,注意是迭代器,我們可以把迭代器理解為陣列的下標,但其實迭代器是一種指標 |
| s.insert(k) | 向集合中加入元素k |
| s.erase(k) | 洗掉集合中元素k |
| s.find(k) | 回傳集合中指向元素k的迭代器,如果不存在這個元素,就回傳s.end() |
deque
| 用法 | 作用 |
|---|---|
| q.begin(),q.end() | 回傳deque的首、尾迭代器 |
| q.front(),q.back() | 回傳deque的首、尾元素 |
| q.push_back() | 從隊尾入隊一個元素 |
| q.push_front() | 從隊頭入隊一個元素 |
| q.pop_back() | 從隊尾出隊一個元素 |
| q.pop_front() | 從隊頭出隊一個元素 |
| q.clear() | 清空佇列 |
deque的特點是雙端進出,即處于雙端佇列中的元素既可以從隊首進/出隊,也可以從隊尾進/出隊,它是線性容器,
deque比queue更優秀的一個性質是它支持隨機訪問,即可以像陣列下標一樣取出其中的一個元素,
c++所有容器表格


表格資料來源:容器庫 - cppreference.com
參考資料
史上最全的各種C++ STL容器全決議 - Seaway-Fu - 博客園 (cnblogs.com)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/511882.html
標籤:C++
上一篇:C++ 如何讀取亂碼檔案內容?
下一篇:資料結構基礎—堆疊和佇列
