c++ container容器(string,vector,map,queue,stack等等)

来源:https://www.cnblogs.com/zhaoqingqing/archive/2022/10/09/16773208.html
-Advertisement-
Play Games

STL和c++標準庫 標準模板庫STL部分包含在C++標準庫中的軟體庫。 c++標準庫:即以std::開頭,但是部分編譯器廠商也會把STL的內容放在std:: namespace裡面 由於一個常見的誤解,您可能會將C++標準庫視為“STL”,或者將工具鏈中C++標準庫的實現部分視為“STL實現”。 ...


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++所有容器表格

cpp

cpp containers

表格數據來源:容器庫 - cppreference.com


參考資料

史上最全的各種C++ STL容器全解析 - Seaway-Fu - 博客園 (cnblogs.com)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 外觀模式是最常用的結構型設計模式,也是一種非常容易理解的設計模式,其核心就是為多個子系統提供一個統一的介面,將這個介面看作是這些子系統的門面。 ...
  • 上次說了一下Go語言佈道師 Dave Cheney對Go併發的建議,個人覺得最重要的一條,這次主要想說一下這個。 8.3. Never start a goroutine without knowning when it will stop(永遠不要在不知道何時停止的情況下啟動 goroutine) ...
  • Future模式 【1】Future模式是多線程開發中常見的設計模式,它的核心思想是非同步調用。對於Future模式來說,它無法立即返回你需要的數據,但是它會返回一個契約,將來你可以憑藉這個契約去獲取你需要的信息。 【2】通俗一點就是生產者-消費者模型的擴展。經典“生產者-消費者”模型中消息的生產者不 ...
  • stream是java8新出的抽象概念,他可以讓你根據你期望的方式來處理集合數據,能夠輕鬆的執行複雜的查找、過濾和映射數據等操作。Stream 使用一種類似用 SQL 語句從資料庫查詢數據的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。 ...
  • 數據結構基礎—棧和隊列 一、棧和隊列的基本概念和性質 棧和隊列都是特殊的線性表 對他們的操作有著規定和限制:在插入和刪除時只能對某一端操作 棧:只能在一端進行(先進後出) 隊列:只能在表尾插入,在表頭刪除(先進先出) 二、棧 表頭為棧底,表尾為棧頂 1.棧的基本操作和規則 a.進棧和出棧 進棧:棧頂 ...
  • 垃圾回收器 垃圾回收是釋放掉那些不再被使用的記憶體空間的過程。 換句話說,垃圾回收器會去檢查哪些對象超出範圍並且不會再被引用到,然後它回去釋放掉那些對象占用的記憶體空間。這個過程實在 go 程式運行中以併發的方式去進行的,不是 go 程式執行之前,也不是 go 程式執行之後。go 垃圾回收器實現的說明文 ...
  • 前幾天看報道說: 一位小哥用AI繪畫工具Midjourney生成的作品,在美國科羅拉多州博覽會的藝術比賽中獲得了第一名。 作者表示,他多次調整了輸入的提示詞,生成了100多幅畫作,經過數周的修改和挑選,才選出了三幅最滿意的作品。 下圖就是獲獎作品 之前我玩過DF,還寫過一篇文章➡️AI繪畫 Disc ...
  • python 有許多可視化工具,但本書只介紹Matplotlib。Matplotlib是一種2D的繪圖庫,它可以支持硬拷貝和跨系統的交互,它可以在python腳本,IPython的交互環境下、Web應用程式中使用。該項目是由John Hunter 於2002年啟動,其目的是為python構建MATL ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...