vector与list的简单介绍

1. 标准库中的vector类的介绍:

vector是表示大小可以变化的数组的序列容器。

就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的元素一样高效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。

在内部,vector使用动态分配的数组来存储其元素。当插入新元素时,可能需要重新分配此数组才能增大大小,这意味着分配一个新数组并将所有元素移动到该数组。就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器时,vector都不会重新分配。

相反,vector容器可能会分配一些额外的存储来适应可能的增长,因此容器的实际容量可能大于包含其元素(即其大小)严格需要的存储。库可以实施不同的增长策略,以平衡内存使用和重新分配之间的平衡,但无论如何,重新分配应该只在大小的对数增长间隔下发生,以便在vector末尾插入单个元素时可以提供摊销的恒定时间复杂度(参见push_back)。

因此,与数组相比,vector消耗更多的内存,以换取以有效的方式管理存储和动态增长的能力。

与其他动态序列容器(deques、lists 和 forward_lists)相比,vector非常有效地访问其元素(就像数组一样),并且相对有效地从其末端添加或删除元素。对于涉及在末尾以外的位置插入或删除元素的操作,它们的性能比其他操作差,并且迭代器和引用的一致性低于列表和forward_lists。

这么多话,简单的来说vector帮我们构建了c语言中的数组,但与c语言数组相比较而言,他的效率与使用起来远远大于数组。

本篇文章就不再详细向上篇文章string的介绍了,这里只给几个经常用到的几个功能的使用案例与其简单的实现;

构造函数

我们知道数组有分很多种

比如如下我们构建整形数组与字符数组: 

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> v;//整形数组vector<char> v;//字符数组vector<double> v;//小数数组return 0;
}

对于vector有多种构造 

我们挨个展示使用案例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> first;                                // 空vector<int> second(4, 100);                       // 4个100vector<int> third(second.begin(), second.end());  // 用second创建,里面存的值与second相同vector<int> fourth(third);                       // a copy of thirdint myints[] = { 16,2,77,29 };vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));//利用数组构造//挨个打印cout << "first:";for (auto e : first){cout << e << " ";}cout << endl;cout << "second:";for (auto e : second){cout << e << " ";}cout << endl;cout << "third:";for (auto e : third){cout << e << " ";}cout << endl;cout << "fourth:";for (auto e : fourth){cout << e << " ";}cout << endl;cout << "The contents of fifth are:";for (vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)cout << ' ' << *it;cout << '\n';return 0;
}

迭代器:

vector的迭代器与string的迭代器完全相关,不太清楚的,可以去看我写的string那一篇,那一篇从原理详细讲解了迭代器;

就比如我们使用迭代器打印上面的second

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> second(4, 100);                       // 4个100vector<int>::iterator it = second.begin();while (it != second.end()){cout << *it << " ";it++;}return 0;
}

同样也有反向的,这里便于观察,我们将second换一组值 

#include<iostream>
#include<vector>
using namespace std;
int main()
{int myints[] = { 16,2,77,29 };vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));//利用数组构造vector<int>::reverse_iterator it = fifth.rbegin();while (it != fifth.rend()){cout << *it << " ";it++;}return 0;
}

最常用的几个:push_back,pop_back,size,empty,clear

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);cout << "添加完后vector:";for (auto& e : v){cout << e << " ";e++;}cout << endl;cout << "vector的大小:";cout << v.size() << endl;v.pop_back();cout << "后删完后vector:";for (auto& e : v){cout << e << " ";e++;}cout << endl;cout << "vector是否为空:";cout << v.empty() << endl;//为空返回true,反之falsecout << "clear后:";v.clear();//清空for (auto& e : v){cout << e << " ";e++;}cout << endl;return 0;
}

查找与修改

vector同样与string一样支持这些功能

就比如查找我们可以通过find查找特定的值,也可以通过直接下标operator[]任意访问

 find

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);t.pop_back();vector<int> ::iterator pos = find(t.begin(), t.end(), 2);cout << *pos << endl;
}

运行结果:             

 insert

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);vector<int> ::iterator pos = find(t.begin(), t.end(), 2);t.insert(pos,10);for (auto& e : t){cout << e << " ";e++;}
}

运行结果:             

 erase

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);vector<int> ::iterator pos = find(t.begin(), t.end(), 2);t.erase(pos);for (auto& e : t){cout << e << " ";e++;}
}

运行结果:             

 swap

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);vector<int> ::iterator pos = find(t.begin(), t.end(), 2);vector<int> v(5, 7);//5个7swap(t, v);cout << "换后的t:" << "  ";for (auto& e : t){cout << e << " ";e++;}cout << endl;cout << "换后的v:" << "  ";for (auto& e : v){cout << e << " ";e++;}cout << endl;
}

运行结果:

operator[] 

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);vector<int> ::iterator pos = find(t.begin(), t.end(), 2);cout << t[2];
}

运行代码:

 其实到这里vector常用的功能已经说完了,

list对于官方的介绍其实很简单,其实就是一句话就可以概括,带头的双向循环链表;

用法与vector差不多完完全全一样,这里就不在多介绍了,给大家推荐一篇好的文章把

STL详解(五)—— list的介绍及使用_stl的list-CSDN博客

STL详解(六)—— list的模拟实现_stl list 作为参数-CSDN博客

如果要自己实现vector与list的模拟实现,需要注意的一点就是深拷贝的问题;

接下来我会再写几篇文章介绍string与vector与list一些特殊的小点帮助理解;

就比如说string的''\0''问题,string的capacity大小设计的特点,空间增长的特点,迭代器失效。

Vector 最大 最小值 索引 位置,扩容的特点......

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

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

相关文章

1975react社区问答管理系统开发mysql数据库web结构node.js编程计算机网页源码

一、源码特点 react 社区问答管理系统是一套完善的完整信息管理类型系统&#xff0c;结合react.js框架和node.js后端完成本系统&#xff0c;对理解react node编程开发语言有帮助系统采用node框架&#xff08;前后端分离&#xff09;&#xff09;&#xff0c;系统具有完整的源…

6种ETL计算引擎介绍

目录 一、ETL计算引擎定义 二、ETL计算引擎的功能和特性 三、6种ETL计算引擎 1、MapReduce 2、Tez 3、Spark 4、Flink 5、ClickHouse 6、Doris 一、ETL计算引擎定义 ETL&#xff08;Extract, Transform, Load&#xff09;计算引擎是用于执行ETL过程中数据转换阶段的关键组件之一…

mac如何压缩视频大小不改变画质,mac怎么压缩视频软件

在数字时代&#xff0c;视频已成为信息传递和娱乐消遣的重要媒介。然而&#xff0c;视频带来的愉悦体验背后&#xff0c;是日益增长的存储和分享压力。大视频文件不仅占用大量存储空间&#xff0c;上传和下载也变得异常缓慢。那么&#xff0c;如何才能有效压缩视频&#xff0c;…

ERROR: No matching distribution found for numpy

1.原因&#xff1a; 出现这两行英文是因为原先输入pip install numpy的方式不安全&#xff0c;不被信任所以无法下载。 2.解决方法&#xff1a; 改成以下命令执行&#xff1a; pip install numpy -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun…

2025年中国国际新能源汽车技术零部件及服务展览会

中国国际新能源汽车技术零部件及服务展览会&#xff0c;从设计到制造、从使用到服务&#xff0c;精准“链”接新能源汽车全产业链的技术供应商和汽车制造商&#xff0c;专业面向新能源造车供应链的行业盛会。2024展会回顾&#xff1a;在展会的3天里&#xff0c;有62家车企核心供…

共享拼购:创新商业模式引领小用户基数下的销售奇迹“

在瞬息万变的商业蓝海中&#xff0c;一个新颖且深具潜力的策略正悄然改变着游戏规则&#xff0c;它巧妙地避开了传统路径的束缚&#xff0c;以微妙却深远的调整&#xff0c;开辟出了一条通往成功的独特航道。我的一位合作伙伴&#xff0c;正是这一策略的实践者&#xff0c;他在…

数字媒体技术基础之:DNG 文件

DNG&#xff08;Digital Negative&#xff09;文件是一种用于存储原始图像数据的文件格式&#xff0c;由 Adobe Systems 于2004年开发并推广。DNG 是一种开放的、非专利的原始图像格式&#xff0c;旨在为不同相机制造商提供一个统一的存储格式。DNG 文件保存了原始的、未处理的…

C++时区转换

#include <iostream> #include "cctz/civil_time.h" #include "cctz/time_zone.h"// 时区转换库 // https://github.com/google/cctzint test() {for (cctz::civil_day d(2016, 2, 1); d < cctz::civil_month(2016, 3); d) {std::cout << &…

【设计模式】设计模式学习线路与总结

文章目录 一. 设计原则与思想二. 设计模式与范式三. 设计模式进阶四. 项目实战 设计模式主要是为了改善代码质量&#xff0c;对代码的重用、解耦以及重构给了最佳实践&#xff0c;如下图是我们在掌握设计模式过程中需要掌握和思考的内容概览。 一. 设计原则与思想 面向对象编…

qt6 获取百度地图(一)

需求分析&#xff1a; 要获取一个地图&#xff0c; 需要ip 需要根据ip查询经纬度 根据经纬度查询地图 另外一条线是根据输入的地址 查询ip 根据查询到的ip查地图‘ 最后&#xff0c;要渲染地图 上面这这些动作&#xff0c;要进行http查询&#xff1a; 为此要有三个QNet…

机器学习与AI大数据的融合:开启智能新时代

在当今这个信息爆炸的时代&#xff0c;大数据和人工智能&#xff08;AI&#xff09;已经成为推动社会进步的强大引擎。作为AI核心技术之一的机器学习&#xff08;Machine Learning, ML&#xff09;&#xff0c;与大数据的深度融合正引领着一场前所未有的科技革命&#xff0c;不…

电子画册制作的小秘密都在这篇文章了

电子画册作为现代营销和展示的重要工具&#xff0c;已经成为各类企业和个人宣传品的首选。相比传统印刷画册&#xff0c;电子画册不仅节省成本&#xff0c;还能通过多媒体元素增强视觉冲击力&#xff0c;提升用户互动体验。本文将介绍电子画册制作的基础步骤和关键要点&#xf…

电气-伺服(4)CANopen

一、CAN Controller Area Network ,控制器局域网&#xff0c;80年的德国Bosch的一家公司研发可以测量仪器直接的实时数据交换而开发的一款串行通信协议。 CAN发展历史 二、CAN 的osi 模型 CAN特性&#xff1a; CAN 的数据帧 三、CANopen 什么是CANopen CANopen 的网络模型 …

Unity In App Purchasing内购校验

1&#xff0c;利用收据验证混淆器 把后台的key填进去&#xff0c;点击自动生成一些文件 2&#xff0c;代码过滤 using UnityEngine.Purchasing.Security;在IAPManager.cs的 public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs e)增加 #if !UNITY_EDITOR…

香橙派AIpro如何赋能AI+边缘流媒体设备

文章目录 &#xff08;一&#xff09;前言&#xff08;二&#xff09;AI边缘流媒体设备展示&#xff08;三&#xff09;赋能AI边缘流媒体设备1、准备开发环境2、在板子中下载编译安装SRS3、基本推拉流测试4、多路推流性能测试 &#xff08;四&#xff09;一些注意事项1、开发板…

springboot 篮球馆管理系统-计算机毕业设计源码21945

目 录 摘要 1 绪论 1.1选题背景 1.2研究意义 1.3论文结构与章节安排 2 篮球馆管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

ctfshow sql注入

开启其他注入 web221 limit注入 给出查询语句 以及过滤逻辑为空 获取数据库名即可 limit 用于控制返回结果行数 limit后面似乎只能跟PROCEDURE ANALYSE( ) 函数了 PROCEDURE ANALYSE( ) 函数用于分析查询结果的函数 参数是用来控制函数的 这个参数的位置 可以放入报错函数 原…

MySQL—创建查看删除备份恢复数据库

创建数据库 创建数据库 LLF_DB01CREATE DATABASE LLF_DB01删除数据库DROP DATABASE LLF_DB01创建一个使用utf8字符集的数据库并带校对规则的数据库CREATE DATABASE hsp_db03 CHARACTER SET utf8 COLLATE utf8_bin 查看、删除数据库 显示所有的数据库SHOW DATABASES显示数据库…

AI PC(智能电脑)技术分析

一文看懂AI PC&#xff08;智能电脑&#xff09; 2024年&#xff0c;英特尔、英伟达等芯片巨头革新CPU技术&#xff0c;融入AI算力&#xff0c;为传统PC带来质的飞跃&#xff0c;引领智能计算新时代。 2024年&#xff0c;因此被叫作人工智能电脑&#xff08;AI PC&#xff09;…

2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题超详细解题思路+数据预处理问题一代码分享

B题 洪水灾害的数据分析与预测 亚太中文赛事本次报名队伍约3000队&#xff0c;竞赛规模体量大致相当于2024年认证杯&#xff0c;1/3个妈杯&#xff0c;1/10个国赛。赛题难度大致相当于0.6个国赛&#xff0c;0.8个妈杯。该比例仅供大家参考。 本次竞赛赛题难度A:B:C3:1:4&…