C++STL 6大组件—你必知必会的编程利器

news2024/10/9 12:34:44

课程总目录


文章目录

  • 一、vector容器
  • 二、deque和list容器
  • 三、vector、deque、list横向对比
  • 四、详解容器是配置stack、queue、priority_queue
  • 五、无序关联容器
  • 六、有序关联容器
  • 七、迭代器
  • 八、函数对象
  • 九、泛型算法和绑定器


一、vector容器

底层数据结构是动态开辟的数组,每次以原来空间大小的2倍进行扩容

使用前需要包含头文件:#include <vector>

容器中对象的构造析构,内存的开辟释放,是通过空间配置器allocator实现:allocate(内存开辟)、deallocate(内存释放)、construct(对象构造)、destroy(对象析构)

使用方法:

vector<int> vec;

增加:

  • vec.push_back(20);,在容器末尾增加一个元素,时间复杂度O(1),有可能会导致容器扩容
  • vec.insert(it, 20);,在迭代器it指向的位置增加一个元素,时间复杂度O(n),有可能会导致容器扩容

删除:

  • vec.pop_back();,在容器末尾删除一个元素,时间复杂度O(1)
  • vec.erase(it);,删除迭代器it指向的元素,时间复杂度O(n)

查询:

  • 提供了operator[]重载函数,数组下标的随机访问,例如vec[5],时间复杂度O(1)
  • iterator,迭代器进行遍历,一定要考虑迭代器失效问题
  • findfor_each等泛型算法
  • C++11提供的语法糖foreach,其实就是通过迭代器来实现的

注意:对容器进行连续插入或者删除操作(insert/erase),一定要更新迭代器,否则第一次insert或者erase之后,迭代器就失效了,失效问题详见这里

常用方法:

  • size();,返回容器底层有效元素的个数
  • empty();,判断容器是否为空
  • reserve();,为vector预留空间,只给容器底层开辟指定大小空间并不添加新的元素
  • resize();,扩容,不仅给容器底层开辟指定大小空间,还会添加新的元素
  • swap();,两个容器进行元素交换

代码示例:元素遍历

vector<int> vec;
for (int i = 0; i < 20; ++i)
	vec.push_back(i);

int size = vec.size();
for (int i = 0; i < size; ++i)
	cout << vec[i] << " ";
cout << endl;

auto it1 = vec.begin();
for (; it1 != vec.end(); ++it1)
	cout << *it1 << " ";
cout << endl;

运行结果:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

代码示例:删除所有偶数

vector<int> vec;
for (int i = 0; i < 20; ++i)
	vec.push_back(i);

auto it = vec.begin();
while (it != vec.end())
{
	if (*it % 2 == 0)
		it = vec.erase(it);
	else
		++it;
}

int size = vec.size();
for (int i = 0; i < size; ++i)
	cout << vec[i] << " ";
cout << endl;

运行结果:

1 3 5 7 9 11 13 15 17 19

代码示例:所有奇数前面加一个比其小1的数

vector<int> vec;
for (int i = 0; i < 20; ++i)
	vec.push_back(i);

for (auto it = vec.begin(); it != vec.end(); ++it)
{
	if (*it % 2 == 1)
	{
		it = vec.insert(it, *it - 1);
		++it;
	}
}

int size = vec.size();
for (int i = 0; i < size; ++i)
	cout << vec[i] << " ";
cout << endl;

运行结果:

0 0 1 2 2 3 4 4 5 6 6 7 8 8 9 10 10 11 12 12 13 14 14 15 16 16 17 18 18 19

代码示例:reserve预留空间

reserve只是预留空间,只给容器底层开辟指定大小空间并不添加新的元素

默认定义的vector底层开辟空间为0,第一次push_back插入从0变更为1,再变为2,4,8,16,32…,一直进行二倍扩容,扩容频繁,效率太低,假如开始知道问题的数据量大小,即可使用reserve预留空间

vector<int> vec;
vec.reserve(20);

cout << vec.empty() << endl;
cout << vec.size() << endl;

for (int i = 0; i < 20; ++i)
	vec.push_back(i);

cout << vec.empty() << endl;
cout << vec.size() << endl;

运行结果:

1
0
0
20

代码示例:resize扩容

resize扩容,不仅给容器底层开辟指定大小空间,还会添加新的元素,没有指定添加的元素值则为0

vector<int> vec;
vec.resize(10);

cout << vec.empty() << endl;
cout << vec.size() << endl;

for (int i = 0; i < 20; ++i)
	vec.push_back(i);

cout << vec.empty() << endl;
cout << vec.size() << endl;

int size = vec.size();
for (int i = 0; i < size; ++i)
	cout << vec[i] << " ";
cout << endl;

运行结果:

0
10
0
30
0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

若改为vec.resize(10,3);,则运行结果为:

0
10
0
30
3 3 3 3 3 3 3 3 3 3 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

二、deque和list容器

deque:使用前需要包含头文件:#include <deque>

双端队列容器,底层数据结构为动态开辟的二维数组。 一维数组从2开始,以2倍的方式进行扩容,每次扩容后,原来第二维的数组,从新的第一维数组的下标oldsize/2开始存放(也就是扩容之后的中间),前后都预留相同的空行,方便支持双端的元素添加

在这里插入图片描述
随着元素增加:
在这里插入图片描述
如果继续增加呢?会对第一维扩容
在这里插入图片描述
使用方法:

deque<int> deq;

增加:

  • deq.push_back(20);,从末尾添加元素,时间复杂度O(1),可能引起扩容
  • deq.push_front(20);,从首部添加元素,时间复杂度O(1),可能引起扩容。vector中没有该方法,需要使用vec.insert(vec.begin(), 20),O(n)
  • deq.insert(it, 20);,迭代器it指向的位置添加元素,时间复杂度O(n)

删除:

  • deq.pop_back();,从末尾删除元素,时间复杂度O(1)
  • deq.pop_front();,从首部删除,时间复杂度O(1)
  • deq.erase(it);,迭代器it指向的位置进行元素删除,时间复杂度O(n)

查询:

  • iterator,迭代器进行遍历,一定要考虑迭代器失效问题(连续的inserterase

常用方法:

  • size();,返回容器底层有效元素的个数
  • empty();,判断容器是否为空
  • resize();,扩容,不仅给容器底层开辟指定大小空间,还会添加新的元素
  • swap();,两个容器进行元素交换

list:使用前需要包含头文件:#include <list>

底层数据结构为双向循环链表,结点中包括data、pre、next

vectordeque不同,list允许高效地在任何位置插入和删除元素,但不支持随机访问

使用方法:

list<int> MyList;

增加:

  • MyList.push_back(20);,从末尾添加元素,时间复杂度O(1),可能引起扩容
  • MyList.push_front(20);,从首部添加元素,时间复杂度O(1),可能引起扩容
  • MyList.insert(it, 20);,迭代器it指向的位置添加元素,时间复杂度O(1)

删除:

  • MyList.pop_back();,从末尾删除元素,时间复杂度O(1)
  • MyList.pop_front();,从首部删除,时间复杂度O(1)
  • MyList.erase(it);,迭代器it指向的位置进行元素删除,时间复杂度O(1)

查询:

  • iterator,迭代器进行遍历,一定要考虑迭代器失效问题(连续的inserterase

常用方法:

  • size();,返回容器底层有效元素的个数
  • empty();,判断容器是否为空
  • resize();,扩容,不仅给容器底层开辟指定大小空间,还会添加新的元素
  • swap();,两个容器进行元素交换

三、vector、deque、list横向对比

四、详解容器是配置stack、queue、priority_queue

五、无序关联容器

六、有序关联容器

七、迭代器

八、函数对象

九、泛型算法和绑定器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1863308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客周赛 F 小红的迷宫行走

原题链接&#xff1a;F-小红的迷宫行走​​​​​​ 题目大意&#xff1a;给大小的图&#xff0c;小红初始在&#xff0c;小红想要去&#xff0c;小红可以向下或者向右走&#xff0c;每次花费1代价&#xff0c;并且每个点上面有一个数字&#xff0c;小红可以瞬移到和这个数字不…

ES6模板字符串详解

ES6是JavaScript语言的一次重大更新&#xff0c;引入了许多新特性和语法改进&#xff0c;其中模板字符串是一个非常实用和灵活的语法特性。它可以让我们从数组或对象中提取值&#xff0c;并赋给对应的变量&#xff0c;让代码变得更加简洁和易读。 本文将深入探讨ES6解构赋值的语…

数据结构:栈(stack)详解 c++信息学奥赛基础知识讲解

目录 一、栈的定义 二、栈的操作 三、代码实操 四、栈的实现 1、string实现stack 2、vector实现stack 3、deque实现栈 一、栈的定义 stack是一个比较简单易用的数据结构&#xff0c;stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff…

泰勒斯威夫特2022年纽约大学毕业典礼演讲:NYU‘s 2022 Commencement Speaker Taylor Swift

NYU’s 2022 Commencement Speaker Taylor Swift Link: https://www.youtube.com/watch?vOBG50aoUwlI Singer, songwriter, producer, and director Taylor Swift received a Doctor of Fine Arts, honoris causa, at the Commencement for the Class of 2022 and delivered …

Java | Leetcode Java题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(int[] nums) {if (nums null || nums.length 0) {return 0;}int length nums.length;if (length 1) {return nums[0];}int first nums[0], second Math.max(nums[0], nums[1]);for (int i 2; i <…

图形编辑器基于Paper.js教程04: Paper.js中的基础知识

背景 了解paper.js的基础知识&#xff0c;在往后的开发过程中会让你如履平地。 基础知识 paper.js 提供了两种编写方式&#xff0c;一种是纯粹的JavaScript编写&#xff0c;还有一种是使用官方提供的PaperScript。 区别就是在于&#xff0c;调用paper下的字对象是否需要加pa…

吉他练琴软件哪个好 Guitar Pro如何辅助练琴

在现代音乐学习和创作中&#xff0c;吉他打谱软件的作用越来越为人们所重视。随着技术的不断发展&#xff0c;各种吉他练琴软件也如雨后春笋般涌现&#xff0c;为吉他爱好者提供了更多选择。下面我们来看看吉他练琴软件哪个好&#xff0c;Guitar Pro如何辅助练琴的相关内容。 一…

出现 defineProps is a compiler macro and no longer needs to be imported. 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行前端代码的时候,出现如下问题: [@vue/compiler-sfc] defineProps is a compiler macro and no longer needs to be imported.[@vue/compiler-sfc] defineEmits is a compiler macro and no longer needs to be impo…

在线客服源码系统全端通用 源码完全开源可以二次开发 带完整的安装代码包以及搭建教程

系统概述 在线客服源码系统采用了先进的技术架构&#xff0c;包括前端界面、后端服务、数据库等部分。前端界面采用了响应式设计&#xff0c;能够自适应不同的设备屏幕尺寸&#xff0c;为用户提供良好的使用体验。后端服务采用了高性能的服务器架构&#xff0c;确保系统的稳定…

【安全审核】音视频审核开通以及计费相关

融云控制台音视频审核入口&#xff1a;音视频审核 1 音视频审核文档&#xff1a;融云开发者文档 1 提示&#xff1a; 开发环境&#xff1a; 免费体验 7 天&#xff08;含 21 万分钟音频流和 420 万张视频审核用量&#xff09;&#xff0c;免费额度用尽后&#xff0c;将关停服务…

echarts 折线图柱状图增加点击事件

单折线图&#xff0c;可以直接监听click事件&#xff08;只有点击到折线才会触发&#xff09; this.chart.on(click, () > {console.log(点击,.s)})但很多时候&#xff0c;我们是要求点击折线图任意位置触发点击事件 而且要注意隐藏折线的操作按钮 this.chart.getZr().on…

C++ | Leetcode C++题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret;} };

RabbitMQ实践——搭建多人聊天服务

大纲 用户登录创建聊天室监听Stream&#xff08;聊天室&#xff09;发送消息实验登录Tom侧Jerry侧 创建聊天室Jerry侧Tom侧 进入聊天室Jerry侧Tom侧 发送消息Jerry发送消息Jerry侧聊天室Tom侧聊天室 Tom发送消息Jerry侧聊天室Tom侧聊天室 代码工程参考资料 在《RabbitMQ实践——…

LongRAG:增强长上下文大语言模型的检索增强生成

这篇论文的标题是《LongRAG: Enhancing Retrieval-Augmented Generation with Long-context LLMs》&#xff0c;由滑铁卢大学的Ziyan Jiang、Xueguang Ma和Wenhu Chen撰写。论文主要探讨了在传统的检索增强生成&#xff08;RAG&#xff09;框架中存在的一些问题&#xff0c;并提…

Linux基础 - 存储结构与管理硬盘

目录 零. 简介 一. 文件系统 Ubuntu 文件系统结构&#xff1a; 路径: 二. 硬盘管理 零. 简介 Linux 文件系统是一种用于组织和存储文件、目录以及相关数据的架构。 常见的 Linux 文件系统有&#xff1a; Ext4&#xff08;Fourth Extended File System&#xff09;&#…

数据结构:队列详解 c++信息学奥赛基础知识讲解

目录 一、队列概念 二、队列容器 三、队列操作 四、代码实操 五、队列遍历 六、案例实操 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 详细代码&#xff1a; 一、队列概念 队列是一种特殊的线性…

了解负载均衡器

现代系统变得越来越复杂&#xff0c;但这种复杂性确保了处理大量的网络流量和请求。 简单来说&#xff0c;负载均衡器的主要思想就像它的名字一样&#xff0c;它跨服务器提供直接的客户端请求。换句话说&#xff0c;负载均衡器是在多台服务器之间分配网络或应用程序流量的系统…

【系统架构设计师】六、信息系统基础知识(定义|分类|企业信息化系统|生命周期|建设原则|开发方法)

目录 一、信息系统的定义 二、信息系统的分类 三、企业使用的信息化系统 四、信息系统的生命周期 五、信息系统建设原则 六、信息系统的开发方法 6.1 结构化方法 6.2 原型法 6.3 构件化开发方法 6.4 面向服务的方法 6.5 面向对象的方法 6.6 敏捷方法 历年真题考情&#x…

AMSR-E/Aqua L1A 原始观测次数,第 3 版

AMSR-E/Aqua L1A Raw Observation Counts, Version 3 简介 改进后的 V003 AMSREL1A 产品对共同登记参数 A1 和 A2 进行了经验修正&#xff0c;并更新了用于修正 AMSR-E 89 GHz 位置信息的参数文件。因此&#xff0c;第三版 AMSREL1A 数据提高了以下方面的精度&#xff1a;纬度…

【个人博客搭建】(26)发布后端webapi项目

1、选择启动的webapi&#xff0c;右击发布 2、选择左下角的“显示所有设置” 在上一页按钮那边是发布文件夹的目录 地址&#xff0c; 现在界面的就是配置的信息&#xff0c; 配置&#xff1a;Debug、Release 目标框架&#xff1a;我们用的net8.0&#xff0c;就是他&#xff…