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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;帮助开发者快速理…