【C++】STL详解-----(二)vetor的使用

article/2025/6/26 7:32:59

文章目录

  • vector的介绍
  • vector的使用:
        • 元素访问
        • empty
      • vector的增删查改
        • push_back和pop_back
        • insert和erase
  • vector迭代器失效问题
        • 迭代器失效解决方法

在这里插入图片描述

vector的介绍

  1. vector是可变大小数组的容器
  2. vector采用连续空间存储的方式,同时也表示可以采用下标访问
  3. vector的大小可以动态改变
  4. vector的重新分配大小策略:开辟一个新的数组,将原数组的数据移到新数组,并且释放原数组的空间
  5. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长因此存储空间比实际需要的存储空间更大
  6. vector的尾插和尾删的效率较高。但是非尾部元素的插入和删除效率较低

vector的使用:

vecotr的定义方式
方式一:构造一个某类型的空容器

vector<int> v1//构造ing类型的空容器

方式二:构造一个含有n个val的某类型容器

vector<int> v2(10,2)//构造含有10连续为元素2的int类型的容器

方式三:拷贝构造某类型容器

vector<int> v3(v2);

方式四:使用迭代器拷贝构造某一段内容

vector<int>v4(v2.begin(),v2.end())

注意:该方式也用于拷贝其他容器的某一段内容

string s("hello world");
vector<char> v5(s.begin(), s.end());
元素访问

【】访问

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 1);//使用“下标+[]”的方式遍历容器for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;return 0;
}

迭代器访问:

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v(10, 1);//范围forfor (auto e : v){cout << e << " ";}cout << endl;return 0;

vector的空间增长问题
size和capacity

  1. 通过size函数获取当前容器的有效个数元素
  2. 通过capacity函数获取当前容器的最大容量。
int main()
{
vector<int> v2(10,2);
cout << v.size() << endl; //获取当前容器中的有效元素个数
cout << v.capacity() << endl; //获取当前容器的最大容量
}

**#### reserve和resize

  1. 通过reserse函数改变容器的最大容量
  2. resize函数改变容器中的有效元素个数。**

reserve规则:
 1、当所给值大于容器当前的capacity时,将capacity扩大到该值。
 2、当所给值小于容器当前的capacity时,什么也不做。

resize规则:
 1、当所给值大于容器当前的size时,将size扩大到该值,扩大的元素为第二个所给值,若未给出,则默认为0。
 2、当所给值小于容器当前的size时,将size缩小到该值。


int main()
{vector<int> v(10, 2);cout << v.size() << endl; //10cout << v.capacity() << endl; //10v.reserve(20); //改变容器的capacity为20,size不变 cout << v.size() << endl; //10cout << v.capacity() << endl; //20v.resize(15); //改变容器的size为15cout << v.size() << endl; //15cout << v.capacity() << endl; //20return 0;
}
empty

通过empty函数判断当前容器是否为空。

int main() { 
vector<int> v(10, 2); 
cout << v.empty() << endl; return 0; 
}

vector的使用
![[Pasted image 20250519085900.png]]
正向迭代器:

vector的增删查改

push_back和pop_back

通过push_back函数对容器进行尾插,pop_back函数对容器进行尾删。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;v.push_back(1); //尾插元素1v.push_back(2); //尾插元素2v.push_back(3); //尾插元素3v.push_back(4); //尾插元素4v.pop_back(); //尾删元素v.pop_back(); //尾删元素v.pop_back(); //尾删元素v.pop_back(); //尾删元素return 0;
}
insert和erase

通过insert函数可以在所给迭代器位置插入一个或多个元素,通过erase函数可以删除所给迭代器位置的元素,或删除所给迭代器区间内的所有元素(左闭右开)。

	vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.insert(v.begin(), 0); //在容器开头插入0v.insert(v.begin(), 5, -1); //在容器开头插入5个-1v.erase(v.begin()); //删除容器中的第一个元素v.erase(v.begin(), v.begin() + 5); //删除在该迭代器区间内的元素(左闭右开)

vector迭代器失效问题

迭代器的主要作用是是让我们在使用各个容器时不用关心底层的数据节后。在数组中就想到于指针。而且迭代器失效相当于迭代器底层对应的指针指向了一块被释放的空间,继续运行会导致崩溃
示例一(失效):

vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);//v: 1 2 3 4 5vector<int>::iterator pos = find(v.begin(), v.end(), 2); //获取值为2的元素的迭代器v.insert(pos, 10); //在值为2的元素的位置插入10//v: 1 10 2 3 4 5v.erase(pos); //删除元素2???error(迭代器失效)//v: 1 2 3 4 5return 0;

在该代码中,我们本意是使用元素2的迭代器在原序列中2的位置插入一个10,然后将2删除,但我们实际上获取的是指向2的指针,当我们在2的位置插入10后,该指针就指向了10,所以我们之后删除的实际上是10,而不是2。

int main()
{vector<int> v;for (size_t i = 1; i <= 6; i++){v.push_back(i);}vector<int>::iterator it = v.begin();while (it != v.end()){if (*it % 2 == 0) //删除容器当中的全部偶数{v.erase(it);}it++;}return 0;

这里大眼一看觉得没什么问题,但是我们仔细思考:你会发现++和erase导致的–时同时进行的,那么两个指针式绝对会错过的,会造成程序崩溃

迭代器失效解决方法

使用迭代器时,永远记住一句话:每次使用前,对迭代器进行重新赋值。

实例一解决方法:

	vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);//v: 1 2 3 4 5vector<int>::iterator pos = find(v.begin(), v.end(), 2); //获取值为2的元素的迭代器v.insert(pos, 10); //在值为2的元素的位置插入10//v: 1 10 2 3 4 5pos = find(v.begin(), v.end(), 2); //重新获取值为2的元素的迭代器v.erase(pos); //删除元素2

实例2解决办法

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;for (size_t i = 1; i <= 6; i++){v.push_back(i);}vector<int>::iterator it = v.begin();while (it != v.end()){if (*it % 2 == 0) //删除容器当中的全部偶数{it = v.erase(it); //删除后获取下一个元素的迭代器}else{it++; //是奇数则it++}}return 0;
}

http://www.hkcw.cn/article/RQtLQXSuDZ.shtml

相关文章

string类

1. 为什么学习string类&#xff1f; string叫串&#xff0c;它是一个管理字符串的类&#xff0c;现实中为什么要出一个管理字符串的类呢&#xff1f;现实中我们有很多类型&#xff0c;比如int、double、char等&#xff0c;但发现这个世界的一些复杂东西都是通过字符串表示的…

潍坊烟花秀压轴项目缺席遭吐槽 设备故障引争议

多名网友在社交平台发帖表示,5月30日晚他们参加了潍坊世界风筝乐园的烟花秀表演,单人票198元,双人票298元。然而,之前宣传的压轴项目“七彩祥云”并未出现,引发观众不满。潍坊世界风筝乐园工作人员解释称,由于设备故障,“七彩祥云”环节被迫取消,并且当晚和接下来两天的…

江苏城市足球联赛为何这么火 赛事带动文旅热潮

最近,2025年江苏省城市足球联赛“苏超”火了。从“比赛第一,友谊第十四”到各地纷纷推出“跟着赛事游江苏”的文旅优惠,以足球为媒,以赛事为桥,江苏展现了独特的魅力。自5月10日揭幕以来,“苏超”迅速走红,成为江苏省乃至全国关注的热点。你以为“苏超”只是踢踢比赛?殊…

汪涵体验问界M9五座零重力座椅 舒适到不想起

汪涵体验了问界M9的零重力座椅,表情十分享受。这款座椅采用零压感知人体工学专利设计,腰部零压角为121,腿部零压角为136,能够使全身压力均匀分布,带来零压悬浮感。汪涵坐在上面久久不愿起身,甚至在车展主持时也选择躺着进行,这种舒适度让人非常心动。责任编辑:0882

德国为何要解除对援乌武器射程限制 西方军援策略重大转变

2025年5月28日,德国新当选总理弗里德里希默茨在柏林宣布,乌克兰的西方盟友将取消向基辅供应武器的射程限制。这一政策调整涵盖美国、英国、法国和德国等主要援乌国家,标志着西方对乌军援策略的重大转变,随即引发国际社会对俄乌冲突走向的强烈关注。在WDR组织的论坛上,默茨…

Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)

文章目录 1. Nginx目录结构分析1.1 conf目录1.2 html目录1.3 logs目录1.4 sbin目录 2. Nginx的启用方式和停止方式2.1 信号控制2.1.1 信号2.1.2 调用命令 2.2 命令行控制2.2.1 基础操作类2.2.2 配置测试类2.2.3 进程控制类2.2.4 路径与文件类2.2.5 高级配置类 3. Nginx配置文件…

印军高层被追问是否与巴方会面 印空军将领打马虎眼

印巴停火协议签署后,两国都在宣称自己取得了胜利。然而,印度军方的表现却让人失望。5月11日,印度空军中将巴蒂召开记者会,面对记者们的追问,他声称印度空军在这次冲突中表现出色,并坚称打下了好几架巴基斯坦飞机。但当被问及具体数字时,他却表示“不想冒险猜测”,并解释…

大V:辽宁舰率海军最强编队驶入西太 展现惊人实力

自去年10月在南海与山东舰稍微展示了一下双航母的实力后,辽宁舰到今年5月中旬都没有什么动作,大家的目光都放在了更出色的山东舰和福建舰上。然而,辽宁舰在5月下旬南下西太平洋,展示了强大的实力。护航编队包括两艘055型驱逐舰、五艘052D型驱逐舰和三艘054A型护卫舰,再加上…

印度刚喊话巴基斯坦,转头联合蒙古军演?背后算盘藏不住了!

印度最近的一系列举动引起了广泛关注。不久前,印度还在与巴基斯坦紧张对峙,并放狠话威胁对方,紧接着又派了一个大型商业代表团访问台湾。更令人意外的是,印度现在绕过中国,直接与蒙古国进行联合军事演习。这种行为就像是小孩子打架,正面打不过就绕到背后捅手指头。然而,…

25艘龙船巡游广州荔湾湖 展现广府龙舟文化魅力

5月31日,第十五届“荔枝湾新西关”民俗文化活动“五月五龙船鼓”在广州荔湾湖公园盛大开幕。上午8时30分,十多艘来自南海盐步、坑口、茶滘等地的龙船装饰一新,从珠江口岸徐徐进入荔湾湖面,与泮塘村的龙船一同趁景。泮塘村的龙船作为东道主,率先引领着各兄弟村的龙船队伍绕…

河南鹤壁一水库水位下降现千佛石窟 千年佛像重见天日

近日,有网友发布视频显示,河南省鹤壁市淇县夺丰水库水位下降后,露出一处石洞。这处石洞虽然洞口不大,但内部却别有洞天,四周布满佛像,造型精细,栩栩如生。洞内还有较深的积水。不少网友称这个洞为千佛洞,并有人前来打卡。该石窟名为前嘴石窟,开凿于东魏时期,千百年来…

全世界都在划龙舟过端午 全球共庆文化盛宴

当农历五月的暖风拂过东亚的稻田,粽叶的清香飘荡在东南亚的街巷,龙舟的鼓点响彻欧美的河流,全世界共同庆祝源自中国的古老节日——端午节。这个绵延两千多年的传统节日,早已超越地域界限,成为人类共享的文化盛宴。在中国,从江南水乡到北国平原,家家户户清晨便飘起蒸煮粽…

美禁运C919发动机 破局之道在哪里 核心技术自主可控

没有发动机,中国的大飞机还能飞吗?当美国突然暂停向中国商飞出售航空发动机技术时,这个问题迅速引起广泛关注。西方媒体纷纷唱衰“C919即将搁浅”,而中国外交部则强硬回击,坚决反对这种恶意封锁。这场看似突如其来的问题,实际上揭示了中美科技竞争的深层次矛盾——中国航…

python调用C++ DLL

使用C创建动态链接库&#xff1a; dllmain.cpp #include <windows.h> #include <string> #include <vector> #include "opencv2/opencv.hpp"BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {return TRUE…

多米尼加坍塌事故死亡人数升至234人 全国哀悼日持续六天

当地时间5月31日,多米尼加医疗中心报告称,一名在俱乐部屋顶坍塌事故中的重症患者不幸去世,使得该事故的死亡人数上升至234人。这起事故发生在4月8日凌晨,地点是多米尼加首都圣多明各的一家俱乐部。当时俱乐部内正在举行知名歌手的演出,突然倒塌的屋顶导致许多人被埋在废墟…

姜广涛仅剩光合积木一家公司存续 配音演员告别引发关注

5月31日,多名配音演员宣布离开光合积木,未来将以自由人的身份继续参与配音工作,但与光合积木仍会保持项目上的合作。姜广涛也发文表示自己仍在学习的路上,并祝愿同事们在配音道路上继续前行,开启新的篇章。企查查数据显示,姜广涛目前仅关联一家存续状态的企业——北京光合…

刘楚昕称请允许我暂时沉默 获奖感言感动无数人

近日,作家刘楚昕创作的小说《泥潭》获漓江文学奖虚构类奖,获奖感言回忆去世女友感动无数人。刘楚昕通过漓江文学节官方微博写信回应网友:请允许我暂时沉默。责任编辑:0764

以媒:援助混乱凸显加沙居民困境 人道主义的讽刺剧

这年头的人道主义救援似乎充满了各种弯弯绕绕。加沙南部拉法的物资分发现场,表面上宣称要发出46.2万份食品包,沙特和阿联酋出钱,以色列做东,但实际上大部分实际受援的人被排除在外。联合国和老牌援助组织被排挤,分发权交给了私人企业和美国雇佣军。这种操作让人怀疑其真实…

我眼中技术文档的演进图谱:从windows开发手册到 AI 智能体的知识传承

-----一位25年的技术亲历者的时代观察 序 2000 年毕业进入科研所时&#xff0c;我未曾想过 CRT 显示器与泛黄的《Windows 宝典》会成为技术启蒙的坐标。从调试 MFC 控件的桌面开发起步&#xff0c;到 Web1.0 时代与 IE6 兼容性博弈的战术文档&#xff0c;再到 Kubernetes 部…

AI重塑银行客户服务:洞察呼叫中心与CRM的智能化变革

摘要: 随着银行业数字化转型的浪潮奔涌向前,人工智能(AI)正以前所未有的深度和广度渗透至客户服务的核心地带——呼叫中心与客户关系管理(CRM)系统。这不仅是一场技术革新,更是一场围绕客户体验、运营效率和业务增长的战略升级。本文将剖析AI在银行呼叫中心与CRM中的典型…