C++之初识STL—vector
文章目录
- STL基本概念
- 使用STL的好处
- 容器
- vector
- 1.vector容器简介
- 2.vector对象的默认构造函数
- 3.vector对象的带参构造函数
- 4.vector的赋值
- 5.vector的大小
- 6.vector容器的访问方式
- 7.vector的插入
STL基本概念
- STL(Standard Template Library,标准模板库)
- STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)
- 迭代器:算法通过迭代器访问容器里面的数据
- 容器和算法之间通过迭代器进行无缝连接。
- STL 几乎所有的代码都采用了模板类或者模板函数,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会
使用STL的好处
- STL是C++的一部分,因此不需要额外安装什么,被内建在你的编译器里面
- STL的一个重要特点是将数据结构和算法分离
- 程序员不用思考STL的实现过程
- STL具有高可用性,高性能,高移植,跨平台优点
容器
序列式容器:
- 序列式容器每个元素都有固定位置–取决于插入的时机和地点,和元素值无关。
- vector,deque、list、stack、queue
关联式容器:
- 元素位置取决于特定的排序准则,和插入顺序无关
- set、multiset、map、multimap


vector
1.vector容器简介
- 尾部插入速度比较快
- vector是将元素置于一个动态数组中加以管理的容器
- vector可以随机存取元素(支持索引值直接存取)
- vector尾部添加或移除元素的速度非常快速,但是在头部插入或移除元素比较费时
2.vector对象的默认构造函数
vector<class T>vecT;
vector<int>vecInt;
vector<float>vecFloat;
vector<string>vecString;class A{};
vector<A>vecA; //用于存放CA对象的vector容器,
//由于容器元素的存放是按值复制的方式进行,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常vector<A*>vecpA; //用于存放CA对象指针的vector容器
3.vector对象的带参构造函数
理论知识:
- vector(beg,end); //构造函数将[beg,end)区间中的元素拷贝给本身,注意该区间左闭右开
- vector(n,elem);//构造函数将n个elem拷贝给本身
- vector(const vector& vec); //拷贝构造函数
int main()
{int arr[] = { 1,2,3,4,5 }; //用两个指针构造vector<int>v1(arr, arr + 5);vector<int>v2(3, 10);//存储3个10for (int i = 0; i < v2.size(); i++){cout << v2[i] << " ";}cout << endl;vector<int>v3(v1);//用一个已经构造好的对象初始化新的对象for (int i = 0; i < v1.size(); i++){cout << v3[i] << " ";}
}

4.vector的赋值
- vector.assign(beg,end);//将[beg,end)区间中的元素拷贝赋值给本身,注意该区间左闭右开
- vector.assign(n,elem);//将n个elem拷贝赋值给本身
- vector& operator=(const vector& vec);//重载等号操作符
- vector.swap(vec); //将vec与本身的元素互换
int main()
{vector<int>vecIntA(3, 10);vector<int> vecIntB, vecIntC, vecIntD;int iarray[] = { 0,1,2,3,4 };//将数组iarray中的所有元素赋值给vactorIntA容器vecIntA.assign(iarray, iarray + 5);cout << "A:";for (int i = 0; i < vecIntA.size(); i++){cout <<vecIntA[i] << " ";}cout << endl;//将vecIntA中所有元素赋值给vecIntBvecIntB.assign(vecIntA.begin(), vecIntA.end());cout << "B1:";for (int i = 0; i < vecIntB.size(); i++){cout <<vecIntB[i] << " ";}cout << endl;cout << "B2:";vecIntB.assign(vecIntA.begin()+2, vecIntA.end()-1);for (int i = 0; i < vecIntB.size(); i++){cout << vecIntB[i] << " ";}cout << endl;//将4个10拷贝到vecIntCvecIntC.assign(4, 10);cout << "C:";for (int i = 0; i < vecIntC.size(); i++){cout<< vecIntC[i] << " ";}cout << endl;//互换元素vecIntB.swap(vecIntC);cout << "B2:";for (int i = 0; i < vecIntB.size(); i++){cout <<vecIntB[i] << " ";}cout << endl;cout << "C:";for (int i = 0; i < vecIntC.size(); i++){cout << vecIntC[i] << " ";}cout << endl;//重载赋值运算符vecIntD = vecIntC;cout << "D:";for (int i = 0; i < vecIntD.size(); i++){cout << vecIntD[i] << " ";}return 0;
}

5.vector的大小
- vector.size(); //返回容器中元素的个数
- vector.empty(); //判断容器是否为空
- vector.resize(); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
- vector.resize(num,elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
int main()
{vector<int>v1;cout << "v1.size: " <<v1.size()<< endl;if (v1.empty()) //判断容器是否为空{cout << "v1 is empty" << endl;}int array[] = { 1,2,3,4,5 };v1.assign(array, array + 5);//将容器的长度变长v1.resize(10);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//将容器长度变短v1.resize(3);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//将容器长度变长,并且扩展出来的新的元素为指定的值v1.resize(10, 100);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;return 0;
}

6.vector容器的访问方式
- vec.at[idx]; //返回索引idx所指数据,如果idx越界,抛出out_of_range异常
- vec[idx]; //返回索引idx所指的数据,越界时,运行直接报错

7.vector的插入
- 在vector末尾进行插入:push_back、在末尾删除元素:pop_back
- vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
- vector.insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值
- vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值
int main()
{int arr[] = { 1,2,3,4,5 };vector<int>v1(arr, arr + 5);//在末尾插入函数v1.push_back(10);//在末尾删除函数v1.pop_back();//在指定位置插入一个指定元素v1.insert(v1.begin()+3,100); //注意第一个参数不能为下标,应该为指针for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//在指定的位置插入多个元素v1.insert(v1.begin() + 3, 3, 1000);//在下标为3的位置上插入3个1000for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;//将指定的区间中的元素插入到指定的位置上,将50—80插入int b[] = { 40,50,60,70,80,90 };v1.insert(v1.begin() + 7, b + 1, b + 5);for (int i = 0; i < v1.size(); i++){cout << v1[i] << " ";}cout << endl;
}
相关文章:
C++之初识STL—vector
文章目录 STL基本概念使用STL的好处容器vector1.vector容器简介2.vector对象的默认构造函数3.vector对象的带参构造函数4.vector的赋值5.vector的大小6.vector容器的访问方式7.vector的插入 STL基本概念 STL(Standard Template Library,标准模板库)STL 从广义上分为: 容器(con…...
资讯汇总230503
230503 12:21 【放松身心亲近自然 自驾露营成旅游新风尚】今年“五一”假期,我国旅游业的快速恢复催生自驾露营休闲游、短途游、夜游等新型旅游产品提质升级。快速发展的新兴旅游业态,在促进旅游消费、培育绿色健康生活方式等方面发挥了积极作用…...
C++之编程规范
目录 谷歌C风格指南:https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/ 编码规则: • 开闭原则:软件对扩展是开放的,对修改是关闭的 • 防御式编程:简单的说就是程序不能崩溃 •…...
ChatGPT做PPT方案,10组提示词方案!
今天我们要搞定的PPT内容是: 活动类型:节日活动、会员活动、新品活动分析类型:用户分析、新品立项、项目汇报内容类型:内容规划、品牌策划 用到的工具: mindshow 邀请码 6509097ChatGPT传送门(免费使用…...
分布式夺命12连问
分布式理论 1. 说说CAP原则? CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这3个基本…...
sourceTree离线环境部署
目录 1、下载sourceTree安装包,打开之后弹出注册界面(需要去国外网站注册)2、使用技术手段跳过注册步骤3、打开安装包进行安装 注:建议提前安装好git 1、下载sourceTree安装包,打开之后弹出注册界面(需要去…...
6.1.1 图:基本概念
一,基本概念 1.基本定义 (1)图的定义 顶点集不可以是空集,但边集可以是空集。 (2) 有向图的表示: 圆括号 无向图的表示: 尖括号 简单图、多重图: 简单图:…...
SlickEdit for Windows and Linux crack
SlickEdit for Windows and Linux crack 现在可以在“新建注释”对话框中对颜色进行排序,使调色板中的颜色阵列看起来更符合逻辑。 在拆分或扩展行注释时添加了撤消步骤,这样您只需点击“撤消”一次即可撤消行注释扩展。 已更新VHDL颜色编码,…...
ChatGPT实现stackoverflow 解释
stackoverflow 解释 ChatGPT 公开服务以来,程序员们无疑是最早深入体验和"测试"的一批人。出色的效果也引发了一系列知识产权上的争议。著名的 stackoverflow 网站,就宣布禁止用户使用 ChatGPT 生成的内容来回答问题,一经发现&…...
第五章 作业(123)【编译原理】
第五章 作业【编译原理】 前言推荐第五章 作业123 随堂练习课前热身04-17随堂练习04-17课前热身04-24 最后 前言 2023-5-3 22:12:46 以下内容源自《【编译原理】》 仅供学习交流使用 推荐 第四章 作业(123)【编译原理】 第五章 作业 1 1.令文法G为…...
基于Vue的个性化网络学习笔记系统
1.系统登录:系统登录是用户访问系统的路口,设计了系统登录界面,包括用户名、密码和验证码,然后对登录进来的用户判断身份信息,判断是管理员用户还是普通用户。 2.系统用户管理:不管是…...
如何搭建一个HTTP实验环境
这一讲是“破冰篇”的最后一讲,我会先简单地回顾一下之前的内容,然后在 Windows 系统上实际操作,用几个应用软件搭建出一个“最小化”的 HTTP 实验环境,方便后续的“基础篇”“进阶篇”“安全篇”的学习。 “破冰篇”回顾 HTTP …...
Electron 环境搭建
https://start.spring.io/ 在线数据分析网站 https://tj.aldwx.com/ https://www.spsspro.com/ win10如何分屏 拖到边缘 Electron 环境搭建 https://www.electronjs.org/zh/docs/latest/tutorial/%E6%89%93%E5%8C%85%E6%95%99%E7%A8%8B electron 隐藏菜单 electron 标题栏 设…...
农机电招平台~java
摘要 随着农机电招行业的不断发展,农机电招在现实生活中的使用和普及,农机电招行业成为近年内出现的一个新行业,并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单,变…...
springboot+vue体质测试数据分析及可视化设计(源码+文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的体质测试数据分析及可视化设计。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者&a…...
thinkphp+vue+html高校固定资产管理系统维修 租借4h80u
本高校资产管理系统采用的数据库是Mysql,使用thinkphp框架开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框…...
【学习笔记】「北大集训 2021」经典游戏
我觉得很厉害。要是考场上能把这道题切了的话数据结构的水平肯定是不低的。 考虑简化版问题:如果只询问一个点的答案怎么做。 注意,我这么做是有风险的。我把战线拉长了。不过当然,如果连简化版的问题都做不了,那何谈正解&#…...
优惠卷秒杀功能、全局唯一ID、乐观锁解决超卖问题、悲观锁实现一人一单、集群下锁失效问题
文章目录 1 全局唯一ID的需求分析2 Redis实现全局唯一Id3 添加优惠卷4 实现秒杀下单5 库存超卖问题分析6 乐观锁解决超卖问题6 悲观锁实现一人一单7 集群环境下的并发问题 1 全局唯一ID的需求分析 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单…...
Nest的基本概念,以及如何使用Nest CLI来构建一个简单的Web应用程序
Nest是一个用于构建高效、可扩展的Node.js服务器端应用程序的框架。它是基于Express.js构建的,并且提供了多种新特性和抽象层,可以让开发者更加轻松地构建复杂的应用程序。 本文将介绍Nest的基本概念,以及如何使用Nest CLI来构建一个简单的W…...
15个创新世界119座城:1~10章音频
感恩每一个喜欢我文字的朋友,感恩每一次遇见。 最近后台总有朋友留言,能不能每一章配上音频,这样平时开车或挤地铁时也能听听。 谢谢你们在开车和挤地铁的时候都会产生听这本书的冲动。 五一抽空先把前十章的音频转录出来,希望你们…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
