[C++进阶篇]STL中vector的使用

一、vector的介绍

1.vector的介绍
  • vector是表示可变大小数组的序列容器。
  • vector也采用的连续存储空间来存储元素,就是可以采用下标对vector的元素进行访问,和数组一样。
  • 它的大小是可以动态改变的。

2.重要的接口组成


二、 vector迭代器的使用

2.1 vector iterator 的使用

void testvector2()   
{vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);vector<int>::iterator it = v1.begin();  //普通正向迭代器可以读可以写while (it != v1.end()){*it = *it * 2;cout << *it << " ";it++;}vector<int>::reverse_iterator vit = v1.rbegin();  //reverse逆置  reserve保留while (vit != v1.rend()){cout << *vit << " ";vit++;}cout << endl;for (auto e : v1)     //编译器替换成迭代器生成的{cout << e << " ";}cout << endl;
}void print_vector(const vector<int>& v)  //传引用,加引用就加const,const 对象就要用const的迭代器
{vector<int>::const_iterator it = v.begin();while (it != v.end()){//*it = *it + 1;  const的迭代器不可以写,修改cout << *it << " ";it++;}cout << endl;
}

 

2.2 vector空间相关函数

在上一章string中我们详细介绍过所以就不去讲解了

但这里我我们要注意一下:

resize:是直接开空间resize(100)是从低一百个位置开始计算

size是100

reserve:是提前开空间,第0个位置

size是0

2.3 vector的增删查改

2.4 find,sort,swap的介绍

参数是一段迭代器区间,在此区间你要添加需要查找的值,找到后返回这个值对应的迭代器位置
若找不到,则返回迭代器last

vector<int> vv{1,2,3,4,5,6,7,8,9};
auto pos = find(vv.begin(),vv.end(),5);
cout<<*pos;

sort函数

他本质就是快排,所以当我们输入一些数的时候,调用迭代器,他会自动排序

vector<int> vv{5,7,3,9,6,4,1,2,8};
sort(vv.begin().vv.end());

swap函数

这里就不过多介绍了,懂得都懂


2.5  空间关系

 

三、迭代器失效问题

vector底层就是一个指针,vector的迭代器就是原生态指针T*

因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)

3.1  使用迭代器区间来构造

在顺序表中存放string类型:

string str("abcdefg");
vector<string> vv(str.begin(),str.end());template <class InputIterator>
vector(InputIterator first, InputIterator last):_start(nullptr), _finish(nullptr), _end_of_storage(nullptr)
{while (first != last){push_back(*first);++first;}
}

四、深浅拷贝问题


  • resize开辟有效数据空间并初始化时不能使用memset初始化,因为mem系列函数是按字节去处理
  • reserve开辟容量空间时开辟的新空间不能使用memcpy把旧空间的数据拷贝过去,要使用循环赋值过去,因为memcpy是浅拷贝,浅拷贝最后会导致释放旧空间新空间的指针指向一块已被释放的空间,造成程序崩溃

代码测试:

Vector(const Vector<T>& v)
{assert(v._start && v._finish && v._endofsto);_start = new T[v.capacity()];//给size或capacity都可以memcpy(_start, v._start, sizeof(T) * v.size());
}

 解决办法:

Vector(const Vector<T>& v)
{assert(v._start && v._finish && v._endofsto);_start = new T[v.capacity()];//给size或capacity都可以//memcpy(_start, v._start, sizeof(T) * v.size()); //使用memcpy时,数组是二维数组会发生问题for (size_t i = 0; i < size(); i++){_start[i] = v._start[i];_finish = _start + v.size();}_endofsto = _start + v.capacity();
}

、二维数组的开辟和图解

song::vector<song::vector> vv(n); 构造一个vv动态二维数组,vv中总共有n个元素,每个元素都是vector类型的,每行没有包含任何元素,如果n为5时如下所示


代码总结:

#pragma once
#include<iostream>
#include<vector>
#include<assert.h>
#include<list>using namespace std;template<class T>
class Vector
{
public:typedef T* iterator;typedef const T* const_iterator;void swap(Vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofsto, v._endofsto);}iterator begin(){return _start;}const_iterator begin()const{return _start;}iterator end(){return _finish;}const_iterator end()const{return _finish;}Vector():_start(nullptr), _finish(nullptr), _endofsto(nullptr){}template<class InputIterator>Vector(InputIterator first, InputIterator last)//有迭代器区间的构造:_start(nullptr), _finish(nullptr), _endofsto(nullptr){while (first != last){push_back(*first);first++;}}//这里将size_t改为int可以解决间接寻址的错误,但是库中使用的是size_tVector(int n, const T& val = T())//构造函数:插入n个val,T()是匿名对象的缺省,调用默认构造函数:_start(nullptr), _finish(nullptr), _endofsto(nullptr){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}~Vector(){delete[] _start;_start = _finish = _endofsto = nullptr;}/*Vector(const Vector<T>& v):_start(nullptr),_finish(nullptr),_endofsto(nullptr){reserve(v.size());for (const auto& e : v){push_back(e);}}*/Vector(const Vector<T>& v){assert(v._start && v._finish && v._endofsto);_start = new T[v.capacity()];//给size或capacity都可以memcpy(_start, v._start, sizeof(T) * v.size()); //使用memcpy时,数组是二维数组会发生问题/*for (size_t i = 0; i < size(); i++){_start[i] = v._start[i];_finish = _start + v.size();}_endofsto = _start + v.capacity();*/}size_t capacity()const{return _endofsto - _start;}size_t size()const{return _finish - _start;}T& operator[](size_t pos){assert(pos < size());return _start[pos];}const T& operator[](size_t pos)const{assert(pos < size());return _start[pos];}//void reserve(size_t n)//{//	if (n > capacity())//	{//		size_t sz = size();//		T* tmp = new T[n];//		if (_start)//		{//			memcpy(tmp, _start, sizeof(T) * size());//			delete[] _start;//		}//		_start = tmp;//		_finish = _start + sz;//		_endofsto = _start + n;//开辟n个空间//	}//}void reserve(size_t n){if (n > capacity()){size_t sz = size();T* tmp = new T[n];if (_start){memcpy(tmp, _start, sizeof(T)*sz);/*for (size_t i = 0; i < sz; ++i){tmp[i] = _start[i];}delete[] _start;*/}_start = tmp;_finish = _start + sz;_endofsto = _start + n;}}void resize(size_t n, const T& val = T()){if (n > capacity())//扩容{reserve(n);}if (n > size())//初始化,前面的数据不动,后面添加val{while (_finish < _start + n){*_finish = val;_finish++;}}else if (n <= size())//删除数据,但不改变原先的数据{_finish = _start + n;}}void push_back(const T& x){/*if (_endofsto == _finish){reserve(capacity() == 0 ? 4 : 2 * capacity());}*_finish = x;_finish++;*/insert(end(), x);}void pop_back(){assert(_finish > _start);_finish--;}iterator insert(iterator pos, const T& x)//若不传入地址或引用,发生扩容后,p位置将不在start和finish之间                               {                                    //虽然在函数内部修改了pos,但是pos只是p的一份拷贝assert(pos >= _start && pos <= _finish); //库中没有传地址或引用,按照库中的来if (_finish == _endofsto){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : 2 * capacity());pos = _start + len;//不更新pos位置的话,扩容后,迭代器会失效}iterator end = _finish - 1;while (end >= pos){*(end + 1) = *end;end--;}*pos = x;_finish++;return pos;}iterator erase(iterator pos){assert(pos >= _start && pos < _finish);iterator end = pos;while (end <= _finish){*(end) = *(end + 1);end++;}_finish--;return pos;//if (size() < capacity() / 2)//库中可能是这样实现的,缩容可能会有迭代器失效的问题//{//	//缩容//}}Vector<T>& operator=(Vector<T> v)//要交换this和v就不能传引用{swap(v);//交换后,局部变量v销毁时刚好把*this原先的空间给释放掉了return *this;}T& front(){assert(size() > 0);return *_start;}T& back(){assert(size() > 0);return *_finish;}private:iterator _start;iterator _finish;iterator _endofsto;
};

以上就是今天的vector实现,喜欢的话请留下您的支持吧,感谢您的收看



 

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

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

相关文章

Spring Boot 整合SpringSecurity和JWT和Redis实现统一鉴权认证

&#x1f4d1;前言 本文主要讲了Spring Security文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力…

fastapi-Headers和Cookies

在FastAPI中&#xff0c;Headers是一个特殊的类型&#xff0c;用于处理HTTP请求头&#xff08;Headers&#xff09;。Headers允许你接收、访问和修改HTTP请求中的头部信息。 使用Headers&#xff0c;你可以在FastAPI的路由视图中将请求头作为参数接收&#xff0c;并对它们进行…

京东数据平台:2023年9月京东智能家居行业数据分析

鲸参谋监测的京东平台9月份智能家居市场销售数据已出炉&#xff01; 9月份&#xff0c;智能家居市场销售额有小幅上涨。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年9月&#xff0c;京东平台智能家居的销量为37万&#xff0c;销售额将近8300万&#xff0c;同比增…

静态、友好、内在:解析C++中的这些特殊元素和对象复制的优化

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 前面我们学习了C中关于类与对象的许多知识点&#xff0c;今天我们继续学习类与对象&#xff0c;最后再总结一下类与对象中的一些关键字内容&#xff0c;以及需要注意的细节。满满的干货…

3D高斯泼溅(Splatting)简明教程

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 3D 高斯泼溅&#xff08;Splatting&#xff09;是用于实时辐射场渲染的 3D 高斯分布描述的一种光栅化技术&#xff0c;它允许实时渲染从小图像样…

Windows10安装Anaconda与Pytorch的记录

这是一篇关于安装Anaconda和Pytorch的记录与复盘&#xff0c;写的原因是我电脑恢复系统之后东西全没了&#xff0c;再装Pytorch的时候一脸懵逼忘了怎么弄了&#xff0c;写篇记录以备我下一次安装。 1、Anaconda的安装 1.1、Anaconda安装包下载 下载链接: Free Download | An…

基于 Amazon EC2 和 Amazon Systems Manager Session Manager 的堡垒机的设计和自动化实现

文章目录 1. 背景2. 云上堡垒机设计2.1 安全设计2.2 高可用和弹性设计2.3 监控告警设计2.4 自动化部署设计2.4.1 堡垒机代码设计2.4.2 Session Manager 配置设计2.4.3 堡垒机 IAM 角色设计 3. 部署堡垒机3.1 堡垒机部署架构图3.2 堡垒机自动化部署 4. 堡垒机使用场景4.1 堡垒机…

SpringBoot集成JPA实现分页和CRUD

SpringBoot集成JPA实现分页和CRUD 文章目录 SpringBoot集成JPA实现分页和CRUDpom.xmlapplication.propertiesaddCategory.jspeditCategory.jsphello.jsplistCategory.jspCategoryCategoryDAOCategoryServiceCategoryServiceImplPage4NavigatorRedisConfigCategoryControllerHel…

JavassmMYSQL宠物领养系统08465-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 1 绪论 1.1课题背景及意义 1.2研究现状 1.3ssm框架介绍 1.3论文结构与章节安排 2 宠物领养系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 …

【数智化案例展】某国际高端酒店品牌——呼叫中心培训数智化转型项目

‍ 维音案例 本项目案例由维音投递并参与数据猿与上海大数据联盟联合推出的《2023中国数智化转型升级创新服务企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 培训是呼叫中心管理的重要环节&#xff0c;由于员工流动性强、培训需求多样、考核流程繁琐…

竞赛 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习猫狗分类 ** 该项目较为新颖&a…

【H.264】RTP h264 码流 实例解析分析 3 : webrtc

【srs】SRS检测IBMF还是annexb 【H.264】RTP h264 码流 实例解析分析 2 : mediasoup收包 mediasoup 并没完整解析rtp包的内容,可能与mediasoup 只需要转发,不需要解码有关系。 webrtc 本身都是全的。 m98代码,先说关键: webrtc的VideoRtpDepacketizer 第一:对RTPVideoType…

操作系统——初始文件管理(王道视频p58)

1.总体概述&#xff1a; 这一节&#xff0c;主要是 作为 后续 “文件系统”的引子 我认为可以思考的点&#xff1a; &#xff08;1&#xff09;文件之间的逻辑结构——windows中采用根什么的“树状结构”&#xff0c;而文件在外存中的实际物理结构又是什么样的 &#xff08…

《向量数据库指南》——用了解向量数据库Milvus Cloud搭建高效推荐系统

了解向量数据库 ANN 搜索是关系型数据库无法提供的功能。关系型数据库只能用于处理具有预定义结构、可直接比较值的表格型数据。因此,关系数据库索引也是基于这一点来比较数据。但是 Embedding 向量无法通过这种方式直接相互比较。因为我们不知道向量中的每个值代表什么意思,…

趋势:实时的stable diffusion

视频中使用了实时模型&#xff1a;只需2~4 个步骤甚至一步即可生成768 x 768分辨率图像。 这项技术可以把任意的stable diffusion模型转为实时模型。 潜在一致性模型 LCM LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 一小时&#xff09;即可从任何预训练的SD模型中…

【RtpSeqNumOnlyRefFinder】webrtc m98: ManageFrameInternal 的帧决策过程分析

Jitterbuffer(FrameBuffer)需要组帧以后GOP内的参考关系 JeffreyLau 大神分析 了组帧原理而参考关系(RtpFrameReferenceFinder)的生成伴随了帧决策 FrameDecisionFrameDecision 影响力 帧的缓存。调用 OnAssembledFrame 传递已经拿到的RtpFrameObject 那么,RtpFrameObject…

asp.net 创建docker容器

首先创建asp.net web api 创建完成后如下图 添加docker支持 添加docker支持 添加linux docker支持

【Unity数据交互】游戏中常用到的Json序列化

ˊˊ &#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1…

Python基础入门例程36-NP36 谁的数字大(运算符)

最近的博文&#xff1a; Python基础入门例程35-NP35 朋友的年龄是否相等&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程34-NP34 除法与取模运算&#xff08;运算符&#xff09;-CSDN博客 Python基础入门例程33-NP33 乘法与幂运算&#xff08;运算符&#xff0…

行业安卓主板-基于RK3568/3288/3588的AI智能网络广告机/自动售货机/收银机解决方案(三)

广告机 智能网络广告机通过网络将音视频、图片、文档、网页等自由排版创建成节目发布到终端。可针对不同的终端统一管理&#xff0c;统一发布&#xff1b;针对应用场景的集中和分散&#xff0c;可以选用局域网管理和云服务器管理。 自动售货机 随着物联网、大数据、人工智能的…