STL之vector

article/2025/6/9 15:33:16

1 vector初识

1 动态扩展
并不是在原有的空间里面之后续接新的空间,而是找更到的空间,然后将原有的数据拷贝到新的空间,释放原有空间
 


vector容器的迭代器是支持随机访问的迭代器

2 功能描述和函数原型

//默认构造
vector<int> v1;for (int i = 0; i < 10; i++) {v1[i] = i;
}
  1. 主要问题是在 test01() 函数中,你创建了一个空的 vector<int> v1,然后试图用 v1[i] = i 来赋值。这是错误的,因为 v1 是空的,你不能直接用下标访问和赋值。应该使用 push_back() 方法添加元素
for (int i = 0; i < 10; i++) {v1.push_back(i);  // 使用push_back添加元素
}

下面我们来看看vector的构造函数的使用

#include<iostream>
#include<vector>
using namespace std;void printvt(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}void test01(){//默认构造vector<int> v1;for (int i = 0; i < 10; i++) {v1.push_back(i);  // 使用push_back添加元素}printvt(v1);//通过区间方式构造vector<int>v2(v1.begin(), v1.end());printvt(v2);//通过n个element进行构造vector<int>v3(10, 100);printvt(v3);//拷贝构造vector<int>v4(v3);printvt(v4);
}int main() {test01();  // 调用测试函数return 0;
}

2 vector的赋值

三种vector的赋值方式

#include<iostream>
#include<vector>
using namespace std;void printvt(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}void test01(){//默认构造vector<int> v1;for (int i = 0; i < 10; i++) {v1.push_back(i);  // 使用push_back添加元素}printvt(v1);//重载符号=,进行赋值vector<int>v2;v2 = v1;printvt(v2);//assign方法(区间)vector<int>v3;v3.assign(v2.begin(), v2.end());printvt(v3);//assign方法(n个元素)vector<int>v4;v4.assign(10, 100);printvt(v4);
}int main() {test01();  // 调用测试函数return 0;
}

3 vector的容量和大小

下面是有关于vector这个容量和大小的相关函数
 


下面是这个代码的演示

#include<iostream>
#include<vector>
using namespace std;void printvt(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}void test01(){//默认构造vector<int> v1;for (int i = 0; i < 10; i++) {v1.push_back(i);  // 使用push_back添加元素}printvt(v1);if (v1.empty()) {cout << "v1为空" << endl;}cout << "v1的容器:" << v1.capacity() << endl;cout << "v1的大小:" << v1.size() << endl;//重新指定大小//resize默认是用0进行初始化未赋值的//也可以用resize初始化别的数字v1.resize(15, 100);printvt(v1);cout << "v1的容器:" << v1.capacity() << endl;cout << "v1的大小:" << v1.size() << endl;//这样是会减少这个元素的个数的v1.resize(5);printvt(v1);
}int main() {test01();  // 调用测试函数return 0;
}

警告代码样例

v1.resize(15);
printvt(v1);
cout << "v1的容器:" << v1.capacity() << endl;
cout << "v1的大小:" << v1.size() << endl;//这样是会减少这个元素的个数的
v1.resize(15,100);
printvt(v1);

代码中 v1.resize(15, 100); 没有按预期将新增的元素设为 100,而是保持 0,这是因为 resize() 的第二个参数(即填充值)仅在容器扩容时才会生效

  • resize(n, val) 只在扩容时填充 val,如果 n <= size(),则不会修改已有元素
  • assign(n, val) 会直接覆盖整个 vector,强制所有元素变成 val

4 插入和删除

函数原型

这里的插入和删除都是要迭代器

#include<iostream>
#include<vector>
using namespace std;void printvt(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}void test01() {//默认构造vector<int> v1;for (int i = 0; i < 10; i++) {v1.push_back(i);  // 使用push_back添加元素}printvt(v1);//尾删v1.pop_back();printvt(v1);//插入  提供一个迭代器进行插入//头插法1v1.insert(v1.begin(), 100);printvt(v1);//头插法2v1.insert(v1.begin(), 2, 1000);printvt(v1);//删除//删除1v1.erase(v1.begin());printvt(v1);//删除2v1.erase(v1.begin(), v1.end());printvt(v1);}int main() {test01();  // 调用测试函数return 0;
}

梳理所用的方法

push_back() 元素放入到尾部
pop_back()  弹出尾部元素
erase()  删除元素(需要提供迭代器)
insert() 插入元素(需要提供迭代器)
clear()  清除元素

如何插入到任意位置?

  1. 使用 begin() + index:如果你想在特定索引位置插入元素,可以使用 v1.begin() + index 来获取该位置的迭代器
  2. 使用 find 或其他方式定位迭代器:如果你要根据某个条件(比如值等于某个数)来插入,可以用 std::find 或其他算法找到迭代器
// 1. 在索引 2 的位置(第 3 个元素)插入 100v1.insert(v1.begin() + 2, 100);printvt(v1); // 1 2 100 3 4 5// 2. 在值为 3 的元素前面插入 200auto it = find(v1.begin(), v1.end(), 3);if (it != v1.end()) {v1.insert(it, 200);}printvt(v1); // 1 2 100 200 3 4 5

5 vector数据存储

函数的原型


上面是获取元素的方式

#include<iostream>
#include<vector>
using namespace std;void printvt(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}void test01() {//默认构造vector<int> v1;for (int i = 0; i < 10; i++) {v1.push_back(i);  // 使用push_back添加元素}printvt(v1);//利用[]访问for (int i = 0; i < v1.size();i++) {cout << v1[i] << " ";}cout << endl;//利用at来进行访问for (int i = 0; i < v1.size(); i++) {cout << v1.at(i) << " ";}cout << endl;//访问头元素cout << "第一个元素为:" << v1.front() << endl;//访问尾元素cout << "最后一个元素为:" << v1.back() << endl;
}int main() {test01();  // 调用测试函数return 0;
}
front()
back()
at()
operator[]

6 vector互换容器

函数原型
 


我们所需要学习的是怎么使用这个和这个东西的实际用途

#include<iostream>
#include<vector>
using namespace std;void printvt(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}void test01() {vector<int> v1;for (int i = 0; i < 10; i++) {v1.push_back(i);  // 使用push_back添加元素}cout << "互换前:" << endl;printvt(v1);vector<int> v2;for (int i = 10; i > 0; i--) {v2.push_back(i);}printvt(v2);//互换后cout << "互换后:" << endl;v1.swap(v2);printvt(v1);printvt(v2);
}
//实际用途:巧妙运用swap收缩内存大小void test02(){vector<int>v;for (int i = 0; i < 10000; i++) {v.push_back(i);}cout << "容量大小:" << v.capacity() << endl;cout << "容器大小:" << v.size() << endl;v.resize(3);cout << "容量大小:" << v.capacity() << endl;cout << "容器大小:" << v.size() << endl;vector<int>(v).swap(v);cout << "容量大小:" << v.capacity() << endl;cout << "容器大小:" << v.size() << endl;
}int main() {//test01();  // 调用测试函数test02();return 0;
}

我们这里要重点学习这个巧用swap来缩小内存占用

容量大小:12138
容器大小:10000
容量大小:12138
容器大小:3
容量大小:3
容器大小:3

7 预留空间

函数的原型


这个主要的作用是减少重新开辟的时间开销
预留的位置不可以进行初始化,该位置未赋值就无法访问

#include<iostream>
#include<vector>
using namespace std;void printvt(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}void test01(){vector<int>v;int num = 0;int* p = NULL;for (int i = 0; i < 10000; i++) {v.push_back(i);if (p != &v[0]) {p = &v[0];num++;}}cout << num << endl;
}int main() {test01();  // 调用测试函数return 0;
}

这个一共开辟了24次才截止,但是我们用reserve就一次

#include<iostream>
#include<vector>
using namespace std;void printvt(vector<int>& v) {for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << " ";}cout << endl;
}void test01(){vector<int>v;v.reserve(100000);int num = 0;int* p = NULL;for (int i = 0; i < 10000; i++) {v.push_back(i);if (p != &v[0]) {p = &v[0];num++;}}cout << num << endl;
}int main() {test01();  // 调用测试函数return 0;
}

这个一般都是知道元素的大小提前预留空间节省时间的开销


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

相关文章

巴黎圣日耳曼5比0国际米兰 创造队史新篇章

当地时间5月31日晚,2024-2025赛季欧洲冠军联赛决赛在德国慕尼黑落幕。巴黎圣日耳曼以5比0战胜国际米兰,首次夺得欧冠奖杯,书写了队史新篇章。这是巴黎圣日耳曼第三次闯入欧冠决赛,前两次均未能夺冠。此次胜利使巴黎圣日耳曼实现了赛季三冠王的壮举,包括法甲、法国杯和欧冠…

《高级架构师》------- 考后感想

笔者来聊一下架构师考后的感想 复习备考 考前过了很多知识点&#xff0c;只是蜻蜓点水&#xff0c;没有起到复习的作用&#xff0c;即使考出来也不会&#xff0c;下次复习注意这个&#xff0c;复习到了&#xff0c;就记住&#xff0c;或者画出来&#xff0c;或者文件总结&…

Python实现P-PSO优化算法优化Catboost分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着机器学习技术的快速发展&#xff0c;分类问题在金融风控、医疗诊断、推荐系统等领域的重要性日益凸显。CatBoost…

中使馆驳斥马克龙将台湾类比乌克兰 本质区别不可比

当地时间5月31日,法国总统马克龙在香格里拉对话会上表示,如果允许俄罗斯不受约束地占领乌克兰的任何部分,那么台湾也可能面临类似情况。对此,中国驻新加坡大使馆在社交平台脸书上回应称,将台湾问题与乌克兰问题相提并论是不可接受的。中国驻新加坡大使馆指出,台湾问题与乌…

步行者时隔25年第2次总决赛战雷霆 决战在即

北京时间6月1日上午,NBA东部决赛进行了第6场比赛,印第安纳步行者在主场以125比108击败纽约尼克斯,最终以4比2的大比分晋级NBA总决赛。他们的对手将是雷霆队。这是步行者自1999-2000赛季以来首次闯入NBA总决赛。比赛过程中,上半场双方比分紧咬。第三节比赛中,步行者逐渐发力…

如何解读印度宣布将自研隐形战斗机 挑战与前景

印度国防部宣布启动国产隐形战斗机的研制项目,标志着印度在自研和进口隐形战斗机之间做出了选择。隐形战斗机的研制难度极大,全球仅有少数国家具备此能力。外界对印度是否具备自主研发隐形战斗机的能力表示关注。印度防长辛格批准了一项建造先进中型隐形战斗机(AMCA)的框架…

姆巴佩祝贺巴黎夺冠 荣光属于整个俱乐部

北京时间6月1日凌晨,2024-2025赛季欧冠决赛落幕。巴黎圣日耳曼在最终决战中表现出色,上半场杜埃一传一射帮助球队以2-0领先,下半场杜埃完成梅开二度,科瓦拉茨赫利亚单刀扩大比分,马尤卢锁定胜局,最终巴黎圣日耳曼以5-0战胜国际米兰,首次夺得欧冠奖杯。赛后姆巴佩发文祝贺…

巴黎夺得欧冠冠军 创决赛最大分差纪录

北京时间6月1日,欧冠决赛在安联球场举行,巴黎圣日耳曼对阵国际米兰。上半场阿什拉夫破门,19岁的杜埃贡献一传一射。下半场杜埃再入一球,克瓦拉茨赫利亚锁定胜局,马尤卢替补登场后也取得进球,登贝莱则送出两次助攻。最终,巴黎圣日耳曼以5-0大胜国际米兰,创造了欧冠决赛的…

雷军:诋毁 本身就是一种仰望 小米汽车备受期待

6月1日,雷军在微博上宣布,2025年5月小米SU7的交付量将超过28,000台。他表示,公司正在全力为小米YU7的大规模量产做准备,预计7月份开始量产。同一天,小米集团总裁卢伟冰也在微博上表示,无论是SU7的热销还是YU7获得更高的关注和期待,都基于强大的产品力。他强调,小米汽车…

Labubu冲破关税打压美国卖断货 中国智造引领潮流

摩根大通CEO杰米戴蒙访问中国后表示,面对美国的关税打压,中国人并不害怕,想让中国对美国卑躬屈膝的想法是不现实的。中国能够昂首挺胸,因为越来越多的中国公司能生产出让美国消费者喜欢的“中国智造”产品。近期,一个来自中国的娃娃Labubu成为世界顶流。尽管最初被部分人认…

巴啦啦小魔仙凌妈妈扮演者自曝片酬 1500元一天引发热议

5月31日,话题#巴啦啦小魔仙凌妈妈扮演者自曝片酬 登上热搜第一。《巴啦啦小魔仙》中的凌妈妈和凌爸爸在时隔17年后重聚,他们在剧中曾被誉为“理想父母”。凌妈妈的扮演者左左表示,已经17年没有见面,感觉恍如隔世。尽管多年未拍戏,但能留下这样一个经典角色,她感到非常知足…

被童年的回旋镖击中了 旧时光里的小美好

转个不停的小风车、写着“勿忘我”的同学录,“分你一半”的碎碎冰……那些被窝里悄悄许下的愿望,那些拉钩说好一百年不许变的誓言,总会在不经意间窜进思绪,打开尘封的旧时光。寄存童年,让小时候的自己抱抱长大了的自己,愿你童心永葆、快乐相随。责任编辑:zhangxiaohua

第二十章 文本处理

第二十章 文本处理 所有类UNIX系统都严重依赖于文本文件来存储数据&#xff0c;所以存在大量文本操作工具也在情理之中。 相关命令: cat&#xff1a;拼接文件。sort&#xff1a;排序文本行。uniq&#xff1a;报告或忽略重复的行。cut&#xff1a;从每行中删除部分内容。past…

WebStrom创建项目

目录 创建项目创建空项目从本地资源创建项目从版本控制系统中检出项目生成特定框架的项目项目模板将项目另存为模板从模板创建项目删除项目模板 创建项目 在WebStorm中&#xff0c;可以创建空项目、将文件夹作为项目打开、从VCS中检出项目。你还可以通过框架模板生成项目&…

酵母合成单萜类化合物-文献精读135

Advances in the biosynthesis of monoterpenes by yeast 酵母合成单萜类化合物的研究进展 酵母生产木脂素-文献精读118_酵母菌从头合成木质素-CSDN博客 香叶醇酵母生产机器学习优化酵母-文献精读66_ml-enhanced peroxisome capacity enables compartmen-CSDN博客 黄酮类化合…

黄色预警发布南方多地大暴雨 强对流天气来袭

中央气象台继续发布暴雨黄色预警,南方多地将面临大暴雨。预计6月1日08时至2日08时,湖北东部、安徽南部、江西北部、江苏南部、上海、浙江中北部、湖南东北部和西南部、贵州东南部、广西北部以及云南西北部、西藏东南部等地部分地区有大到暴雨。其中,安徽南部、浙江西北部、湖…

男子钓到一条大鱼 仔细一看后放生 善举引热议

河北沧州一名男子用柳枝钓到了一条13斤的大鱼,这一善举引发了网友的热议。这位大哥晚上散步时路过河边,随手折了一根柳枝往水里一甩,没想到手机刚打开录像,就听见“哗啦”一声,一条大鱼咬着柳枝窜了上来,水花四溅。大哥自己都愣住了:“我活了半辈子头回这么钓着鱼!”网…

WebAssembly与CAD深度融合新纪元:高效设计的跨平台革命

摘要 WebAssembly (Wasm) 以其卓越的性能和跨平台特色&#xff0c;正推动计算机辅助设计&#xff08;CAD&#xff09;领域发生根本性变革。本文围绕 Wasm 与 CAD 的深度融合&#xff0c;从核心技术、系统架构、行业实践到未来趋势四个维度展开&#xff0c;结合专业数据、代码实…

对抗进行性核上性麻痹,从一口健康饮食开始

进行性核上性麻痹是一种逐渐进展的神经系统退行性疾病&#xff0c;患者常出现吞咽困难、肌肉僵硬等症状&#xff0c;影响正常进食和营养吸收。科学合理的饮食不仅能保障营养供给&#xff0c;还能缓解不适&#xff0c;提高生活质量。通过选择合适的食物、注重营养搭配&#xff0…

80x86标志寄存器终极指南:从FLAGS到RFLAGS的深度探索(标志寄存器就一定每位都用上的是吗?)

引言&#xff1a;CPU的"状态面板" 在x86架构的核心&#xff0c;有一个特殊的寄存器记录着CPU的每一次"心跳"——这就是标志寄存器。从1978年的8086到现代64位处理器&#xff0c;这个寄存器经历了FLAGS→EFLAGS→RFLAGS的演变&#xff0c;但其核心功能始终…