C++ STL常用容器總結(vector, deque, list, map, set)

C++ STL常用容器總結(vector, deque, list, map, set)

  • 1. vector(動態數組)
    • 特點
    • 定義和初始化
    • 常用操作
    • 遍歷方法
  • 2. deque(雙端隊列)
    • 特點
    • 定義和初始化
    • 常用操作
  • 3. list(雙向鏈表)
    • 特點
    • 定義和初始化
    • 常用操作
    • 遍歷方法
  • 4. map(關聯容器-映射)
    • 特點
    • 定義和初始化
    • 常用操作
    • 遍歷方法
  • 5. set(關聯容器-集合)
      • 特點
    • 定義和初始化
    • 常用操作
    • 遍歷方法
  • 容器選擇指南
  • 通用操作

1. vector(動態數組)

特點

  • 動態大小的數組,內存連續存儲
  • 支持隨機訪問,時間復雜度O(1)
  • 尾部插入刪除效率高O(1),中間插入刪除效率低O(n)

定義和初始化

#include <vector>vector<int> vec1;                          // 默認初始化,vec1為空
vector<int> vec2(vec1);                    // 使用vec1初始化vec2
vector<int> vec3(vec1.begin(),vec1.end()); // 使用vec1初始化vec3
vector<int> vec4(10);                      // 10個值為0的元素
vector<int> vec5(10,4);                    // 10個值為4的元素
vector<int> vec6{1,2,3,4,5};              // 列表初始化

常用操作

// 添加元素
vec1.push_back(100);                       // 尾部添加元素
vec1.insert(vec1.begin(), 50);            // 在開頭插入50
vec1.insert(vec1.end(), 5, 3);            // 從末尾插入5個值為3的元素// 訪問元素
cout << vec1[0] << endl;                   // 下標訪問
cout << vec1.at(0) << endl;               // at()訪問,有邊界檢查
cout << vec1.front() << endl;             // 首元素
cout << vec1.back() << endl;              // 尾元素// 刪除元素
vec1.pop_back();                          // 刪除末尾元素
vec1.erase(vec1.begin());                 // 刪除首元素
vec1.erase(vec1.begin(), vec1.begin()+2); // 刪除[0,2)區間元素// 容器信息
int size = vec1.size();                   // 元素個數
bool isEmpty = vec1.empty();              // 判斷是否為空
vec1.clear();                            // 清空所有元素

遍歷方法

// 1. 下標法
for(int i = 0; i < vec1.size(); i++) {cout << vec1[i] << " ";
}// 2. 迭代器法
for(vector<int>::iterator it = vec1.begin(); it != vec1.end(); it++) {cout << *it << " ";
}// 3. 范圍for循環(C++11)
for(auto x : vec1) {cout << x << " ";
}

2. deque(雙端隊列)

特點

  • 雙端隊列,支持兩端快速插入刪除O(1)
  • 支持隨機訪問O(1)
  • 內存不連續,由多個塊組成

定義和初始化

#include <deque>deque<int> dq1;                           // 默認初始化
deque<int> dq2(10);                       // 10個值為0的元素
deque<int> dq3(10, 5);                    // 10個值為5的元素
deque<int> dq4{1,2,3,4,5};               // 列表初始化

常用操作

// 添加元素
dq1.push_back(100);                       // 尾部添加
dq1.push_front(50);                       // 頭部添加
dq1.insert(dq1.begin()+1, 75);          // 指定位置插入// 訪問元素
cout << dq1[0] << endl;                   // 下標訪問
cout << dq1.at(0) << endl;               // at()訪問
cout << dq1.front() << endl;             // 首元素
cout << dq1.back() << endl;              // 尾元素// 刪除元素
dq1.pop_back();                          // 刪除尾部元素
dq1.pop_front();                         // 刪除頭部元素
dq1.erase(dq1.begin());                  // 刪除指定位置元素// 容器信息
cout << dq1.size() << endl;              // 元素個數
cout << dq1.empty() << endl;             // 是否為空
dq1.clear();                             // 清空

3. list(雙向鏈表)

特點

  • 雙向鏈表,內存不連續
  • 不支持隨機訪問,只能順序訪問
  • 任意位置插入刪除效率高O(1)

定義和初始化

#include <list>list<int> lst1;                          // 默認初始化
list<int> lst2(10);                      // 10個值為0的元素
list<int> lst3(10, 5);                   // 10個值為5的元素
list<int> lst4{1,2,3,4,5};              // 列表初始化

常用操作

// 添加元素
lst1.push_back(100);                     // 尾部添加
lst1.push_front(50);                     // 頭部添加
auto it = lst1.begin();
advance(it, 2);                          // 迭代器前進2位
lst1.insert(it, 75);                     // 指定位置插入// 訪問元素(只能通過迭代器)
cout << lst1.front() << endl;           // 首元素
cout << lst1.back() << endl;            // 尾元素// 刪除元素
lst1.pop_back();                         // 刪除尾部
lst1.pop_front();                        // 刪除頭部
lst1.remove(75);                         // 刪除所有值為75的元素
lst1.erase(lst1.begin());               // 刪除指定位置// 鏈表特有操作
lst1.sort();                            // 排序
lst1.reverse();                         // 反轉
lst1.unique();                          // 去除連續重復元素// 容器信息
cout << lst1.size() << endl;
cout << lst1.empty() << endl;
lst1.clear();

遍歷方法

// 迭代器法
for(list<int>::iterator it = lst1.begin(); it != lst1.end(); it++) {cout << *it << " ";
}// 范圍for循環
for(auto x : lst1) {cout << x << " ";
}

4. map(關聯容器-映射)

特點

  • 存儲鍵值對(key-value)
  • 按key自動排序(基于紅黑樹)
  • key唯一,查找效率O(log n)

定義和初始化

#include <map>map<string, int> mp1;                    // 默認初始化
map<string, int> mp2{{"apple", 5}, {"banana", 3}, {"orange", 8}};  // 列表初始化

常用操作

// 插入元素
mp1["apple"] = 5;                        // 下標法插入/修改
mp1.insert(pair<string, int>("banana", 3)); // insert插入
mp1.insert(make_pair("orange", 8));      // make_pair插入
mp1.emplace("grape", 6);                 // emplace插入(C++11)// 訪問元素
cout << mp1["apple"] << endl;            // 下標訪問
cout << mp1.at("apple") << endl;         // at()訪問// 查找元素
auto it = mp1.find("apple");             // 查找,返回迭代器
if(it != mp1.end()) {cout << "Found: " << it->second << endl;
}// 判斷元素是否存在
if(mp1.count("apple") > 0) {             // count返回0或1cout << "apple exists" << endl;
}// 刪除元素
mp1.erase("apple");                      // 根據key刪除
mp1.erase(mp1.find("banana"));          // 根據迭代器刪除// 容器信息
cout << mp1.size() << endl;
cout << mp1.empty() << endl;
mp1.clear();

遍歷方法

// 迭代器法
for(map<string, int>::iterator it = mp1.begin(); it != mp1.end(); it++) {cout << it->first << ": " << it->second << endl;
}// 范圍for循環
for(auto& pair : mp1) {cout << pair.first << ": " << pair.second << endl;
}// C++17結構化綁定
for(auto& [key, value] : mp1) {cout << key << ": " << value << endl;
}

5. set(關聯容器-集合)

特點

  • 存儲唯一元素,自動排序
  • 基于紅黑樹實現
  • 查找、插入、刪除效率O(log n)

定義和初始化

#include <set>set<int> st1;                           // 默認初始化
set<int> st2{1, 3, 5, 7, 9};           // 列表初始化
set<int> st3(st2.begin(), st2.end());  // 迭代器初始化

常用操作

// 插入元素
st1.insert(10);                         // 插入單個元素
st1.insert({20, 30, 40});              // 插入多個元素
auto result = st1.insert(10);           // insert返回pair<iterator, bool>
if(result.second) {cout << "插入成功" << endl;
}// 查找元素
auto it = st1.find(10);                 // 查找,返回迭代器
if(it != st1.end()) {cout << "Found: " << *it << endl;
}// 判斷元素是否存在
if(st1.count(10) > 0) {                 // count返回0或1cout << "10 exists" << endl;
}// 刪除元素
st1.erase(10);                          // 根據值刪除
st1.erase(st1.find(20));               // 根據迭代器刪除
st1.erase(st1.begin(), st1.end());     // 刪除范圍// 集合運算
set<int> st4{1, 2, 3};
set<int> st5{2, 3, 4};
set<int> result_union, result_intersection;// 并集
set_union(st4.begin(), st4.end(), st5.begin(), st5.end(), inserter(result_union, result_union.begin()));// 交集
set_intersection(st4.begin(), st4.end(), st5.begin(), st5.end(),inserter(result_intersection, result_intersection.begin()));// 容器信息
cout << st1.size() << endl;
cout << st1.empty() << endl;
st1.clear();

遍歷方法

// 迭代器法
for(set<int>::iterator it = st1.begin(); it != st1.end(); it++) {cout << *it << " ";
}// 范圍for循環
for(auto x : st1) {cout << x << " ";
}

容器選擇指南

容器適用場景時間復雜度
vector需要隨機訪問,主要在尾部操作訪問O(1),尾部插入O(1)
deque需要隨機訪問,兩端都要操作訪問O(1),兩端插入O(1)
list頻繁在中間插入刪除,不需隨機訪問插入刪除O(1),查找O(n)
map需要鍵值對映射,要求有序查找插入刪除O(log n)
set需要唯一元素集合,要求有序查找插入刪除O(log n)

通用操作

所有STL容器都支持的操作:

  • size() - 返回元素個數
  • empty() - 判斷是否為空
  • clear() - 清空所有元素
  • begin(), end() - 返回迭代器
  • ==, != - 比較操作符

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916622.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

智能小車(F103C8T6)RT-THREAD版

前言 前面幾章學會了PWM,超聲波等&#xff0c;現在剛好結合起來控制智能小車 1&#xff1a;環境 KEIL5.38 RT-THREAD 3.1.3 STM32F103C8T6 2&#xff1a;硬件配件&#xff08;原來網上買的一套&#xff09; STM32F103C8T6 一個 MCU底板 一個 SG90 舵機 一個 紅外避障 2個 hc-…

Linux 遠程連接與文件傳輸:從基礎到高級配置

Linux 遠程連接與文件傳輸&#xff1a;從基礎到高級配置 在 Linux 系統管理中&#xff0c;遠程連接和文件傳輸是核心技能。SSH 協議提供了安全的遠程訪問方式&#xff0c;而基于 SSH 的 SFTP 和 SCP 則解決了跨服務器文件傳輸的需求。下面將詳細解析 SSH 服務配置、三種遠程操作…

17. 如何修改 flex 主軸方向

總結 flex-direction: row | row-reverse | column | column-reverse;一、作用說明 在 Flex 布局中&#xff0c;默認的主軸&#xff08;main axis&#xff09;方向是 水平向右&#xff08;即 row&#xff09;。 通過設置 flex-direction 屬性&#xff0c;可以靈活改變主軸的方向…

【Linux】重生之從零開始學習運維之mysql用戶管理

mariadb用戶管理創建用戶create user test210.0.0.% identified by 123456;用戶改名rename user test210.0.0.% to test310.0.0.%;用戶刪除 drop user test310.0.0.%;mysql用戶管理創建用戶create user test210.0.0.% identified by 123456;用戶改名rename user test210.0.0.% …

matlab小計

3.變量命名_嗶哩嗶哩_bilibili clc 清空頁面 文件名&#xff1a;字母開頭 clc:清除命令行窗口 clear all&#xff1a;清除工作區變量 編譯器里面 %%注釋 24 2-4 2*4 4/2 cumsum累計和 312 6123 movsum:滑窗計算數值 eg步長是3 1236 2349 6 9 ... 按列求最大值 先列…

getdents64系統調用及示例

getdents64 函數詳解 1. 函數介紹 getdents64 是 Linux 系統中用于讀取目錄內容的底層系統調用。可以把這個函數想象成一個"目錄內容掃描儀"——它能夠高效地掃描目錄中的所有文件和子目錄,就像超市的掃描槍快速讀取商品條碼一樣。 與高級的目錄操作函數(如 rea…

HBuilder X打包發布微信小程序

一、獲取AppId 二、獲取微信小程序AppId 三、發行->微信小程序&#xff0c;調起微信開發者工具 四、點擊上傳,上傳至微信公眾平臺 五、微信公眾平臺查看版本管理 完結&#xff01;&#xff01;&#xff01;

docker排查OOM

思路&#xff1a; 1.先從代碼程序上排查&#xff0c;線程池創建是否使用ThreadPoolExecutor&#xff0c;線程池各項設置是否合理。 任務對象是否釋放&#xff0c;網關是否需要限流。 2.服務器內存大小&#xff0c;cpu使用率&#xff0c;存儲空間大小&#xff0c;java程序啟動…

Web后端進階:springboot原理(面試多問)

1.配置優先級 3種配置文件: application.properties server.port8081application.yml server:port: 8082application.yaml server:port: 80822種外部屬性的配置(Java系統屬性、命令行參數): Java系統屬性配置 &#xff08;格式&#xff1a; -Dkeyvalue&#xff09; -Dserver.po…

第十天:字符菱形

每日一道C題&#xff1a;字符菱形 問題&#xff1a;給定一個字符&#xff0c;用它構造一個對角線長5個字符&#xff0c;傾斜放置的菱形。 要求&#xff1a;輸入只有一行&#xff0c; 包含一個字符&#xff1b;輸出該字符構成的菱形。 最基礎的做法&#xff1a; #include <io…

Qt 多線程編程最佳實踐

在現代軟件開發中&#xff0c;多線程編程是提升應用性能和響應性的關鍵技術。Qt 作為一個強大的跨平臺框架&#xff0c;提供了豐富的多線程支持&#xff0c;包括 QThread、QtConcurrent、信號槽機制等。本文將深入探討 Qt 多線程編程的最佳實踐&#xff0c;幫助開發者避免常見陷…

Photo Studio PRO 安卓版:專業級照片編輯的移動解決方案

Photo Studio PRO 安卓版是一款功能強大的專業級照片編輯應用&#xff0c;旨在為用戶提供豐富而強大的編輯工具和特效&#xff0c;幫助用戶輕松地對照片進行美化和修飾。無論是攝影愛好者還是專業攝影師&#xff0c;都能通過這款應用實現從基礎調整到高級合成的全流程編輯。 核…

2025高考志愿怎么填?張雪峰最新“保底”推薦來了!這4個專業專科也能拿高薪,畢業不愁!

專業選得好&#xff0c;就業跑不了&#xff01;2025年高考落幕&#xff0c;現在是決戰未來的關鍵時刻&#xff0c;選專業比選學校更重要&#xff01; 今天&#xff0c;學長就根據張雪峰老師多次力薦、再結合2024年就業大數據&#xff0c;給大家盤點4個緊缺人才專業&#xff0c…

C++初學者4——標準數據類型

先導&#xff1a; 目錄 一、整形 二、浮點型 &#xff01;保留指定小數位數 三、布爾類型 關系運算 邏輯運算 ?C邏輯運算四句口訣? 四、字符型 ASCll碼 C中的字符表示 字符比較 ASCII中的常用轉換 大小寫轉換 轉換成0~25 五、數據類型隱式轉換 ?1. 隱式轉…

HCIP的MGRE綜合實驗1

拓撲圖&#xff1a;二、實驗要求 1、R5為ISP&#xff0c;只能進行IP地址配置&#xff0c;其所有地址均配為公有Ip地址;2、R1和R5間使用PPP的PAP認證&#xff0c;R5為主認證方&#xff1b;R2與R5之間使用PPP的CHAP認證&#xff0c;R5為主認證方;R3與R5之間使用HDLC封裝;3、R2、R…

Go語言實戰案例-鏈表的實現與遍歷

在數據結構的世界中&#xff0c;鏈表&#xff08;Linked List&#xff09; 是一種經典的線性結構&#xff0c;它以靈活的插入與刪除能力著稱。鏈表不像數組那樣需要連續的內存空間&#xff0c;而是通過節點指針連接形成一條“鏈”。本篇我們將使用 Go 語言實現一個單向鏈表&…

C++常見的仿函數,預定義函數,functor,二元操作函數(對vector操作,加減乘除取余位運算等 )

C 標準庫在 <functional> 頭文件中為我們提供了一套非常方便的預定義函數對象&#xff08;也稱為“仿函數”或 “functor”&#xff09;&#xff0c;它們可以像變量一樣直接傳遞給 std::reduce 和其他標準算法。 你提到的 std::bit_or 和 std::multiplies 就是其中的成員…

【RH134 問答題】第 6 章 管理 SELinux 安全性

目錄SELinux 是如何保護資源的&#xff1f;什么是自由決定的訪問控制(DAC)&#xff1f;它有什么特點&#xff1f;什么是強制訪問控制(MAC)&#xff1f;它有什么特點&#xff1f;什么是 SELinux 上下文&#xff1f;setenforce 0 命令的作用是什么&#xff1f;定義一條 SELinux 文…

【MacOS】發展歷程

很高興為您詳細介紹 macOS 的詳細發展歷程。macOS 是蘋果公司開發的操作系統&#xff0c;用于 Mac 電腦、iPad 和 Apple TV 等設備。以下是 macos 的主要版本和發展歷程&#xff1a;1. System 7 (1991)發布日期&#xff1a;1991年特點&#xff1a;引入多任務處理功能。改進了拖…

智慧社區項目開發(二)——基于 JWT 的登錄驗證功能實現詳解

在 Web 應用中&#xff0c;登錄驗證是保障系統安全的核心環節。本文將結合具體接口文檔&#xff0c;詳細講解如何基于 JWT&#xff08;JSON Web Token&#xff09;實現登錄驗證功能&#xff0c;包括 JWT 配置、工具類封裝、登錄流程處理等關鍵步驟&#xff0c;幫助開發者快速理…