C++——STL(vector类)

1.vector的介绍

vector的文档介绍

  1. vector是表示可变大小数组的序列容器。
  2. vector就像数组一样,拥有连续的储存空间来储存元素,这就意味着可以通过下标的方式来访问vector的元素,很高效;但与数组不同的是vector的大小是动态改变的
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好。

2.vector的使用

2.1 vector的定义

(constructor):构造函数声明

模拟实现的vector构造:

class vector
{
public://无参构造vector():_start(nullptr),_finish(nullptr),_endOfStorage(nullptr){}//构造并初始化n个valvector(int n, const T& val = T()):_start(new T[n]),_finish(_start+n),_endOfStorage(_start+n){for (size_t i = 0; i < n; i++){_start[i] = val;}}//拷贝构造vector(const vector<T>& val):_start(nullptr),_finish(nullptr),_endOfStorage(nullptr){reserve(val.capacity());iterator it = begin();const_iterator vit = val.begin();while (it != val.end()){*it = *vit;++it;++vit;}}//迭代器构造template<class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}private:iterator _start=nullptr;        //指向数据块的开始iterator _finish=nullptr;		//指向数据块的尾iterator _endOfStorage=nullptr; //指向存储容量的尾
}

2.2 vector iterator的使用

begin+end 接口说明:获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator

rbegin +rend 接口说明:获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的
reverse_iterator

模拟实现的vector iterator:

//vector 的迭代器是原生指针
typedef T* iterator;
typedef const T* const_iterator;iterator begin()
{return _start;
}const_iterator begin() const
{return _start;
}iterator end()
{return _finish;
}const_iterator end() const
{return _finish;
}

 2.3 vector的空间问题

接口及其说明:

size :获取数据个数;

capacity :获取容量大小;

empty :判断是否为空;

resize :改变vector的size;

reserve :改变vector的capacity;

关于resize与reserve:

  • reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  • resize在开空间的同时还会进行初始化,影响size。

vector 空间接口模拟实现:

//size
size_t size() const
{return _finish - _start;
}//capacity
size_t capacity() const
{return _endOfStorage - _start;
}//empty
bool empty() const
{return _start == _finish;
}//reserve
void reserve(size_t n)
{size_t oldsize = size();if (n > capacity()){//开辟新空间T* tmp = new T[n];//拷贝数据if (_start){for (size_t i = 0; i < oldsize; i++){tmp[i] = _start[i];}//释放原空间delete[] _start;}_start = tmp;_finish = _start + oldsize;_endOfStorage = _start + n;}
}//resize
void resize(size_t n, const T& val = T())
{if (n <= size()){_finish = _start + n;return;}//如果n大于之前的容量,则扩容if (n > capacity()){reserve(n);}iterator it = _finish;while (it != _start + n){*it = val;++it;}
}

 2.4 vector的增删查改

接口及其说明:

push_back :尾部插入;

pop_back :尾部删除;

insert :在position之前插入val;

erase :删除position位置的数据;

swap :交换两个vector的数据空间;

operator[] :下标访问;

模拟实现:

//insert
iterator insert(iterator pos, const T& val)
{assert(pos <= _finish);assert(pos >= _start);if (size() == capacity()){size_t possize = pos - _start;size_t newcapacity = capacity() == 0 ? 4 : capacity() * 2;reserve(newcapacity);//如果发生了增容pos = _start + possize;}iterator it = _finish;while (it != pos){*it = *(it - 1);--it;}*pos = val;++_finish;return pos;
}//erase
iterator erase(iterator pos)
{assert(pos < size());iterator it = pos;while (it != _finish){*it = *(it + 1);++it;}--_finish;return pos;
}//push_back
void push_back(const T& val)
{insert(end(), val);
}//pop_back
void pop_back()
{assert(size() > 0);--_finish;
}//operator[]
T& operator[](size_t pos)
{assert(pos < size());return _start[pos];
}const T& operator[](size_t pos) const
{assert(pos < size());return _start[pos];
}//swap
void swap(vector<T>& v)
{std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endOfStorage, v._endOfStorage);
}

3.vector 迭代器失效

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T* 。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器,程序可能会崩溃)。

对于vector可能会导致其迭代器失效的操作有:

1. 会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。只要涉及扩容就有可能导致迭代器失效问题

解决方案:当发生扩容后重新给迭代器变量赋值即可。

2.指定位置元素的删除操作--erase

erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。因此删除vector中任意位置上元素时,vs就认为该位置迭代器失效了。

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

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

相关文章

新加坡服务器:亚洲地区的优选之选

在全球化日益加深的今天&#xff0c;互联网成为了连接世界的桥梁&#xff0c;而服务器作为互联网的基础设施&#xff0c;其选择对于企业的业务发展和用户体验至关重要。在众多海外服务器中&#xff0c;新加坡服务器以其独特的地理位置、先进的技术支持、稳定的网络环境以及完善…

站长工具 API 接口,助力网站管理新高度

站长工具是一款非常实用的网站管理工具&#xff0c;通过其提供的API接口&#xff0c;可以轻松实现多种功能&#xff0c;如域名反查、域名备案查询、IPV6归属地查询等。这些功能可以帮助网站管理员更好地管理和优化自己的网站。以下是简单的代码示例&#xff0c;展示了如何使用站…

未雨绸缪:环保专包二级资质续期工程师招聘时间策略

对于环保企业而言&#xff0c;在二级资质续期前启动工程师招聘的时间规划至关重要。考虑到招聘流程的复杂性、企业内部需求的变化以及政策标准的更新&#xff0c;建议环保企业在二级资质续期前至少提前6至12个月启动工程师招聘工作。这个时间规划可以细化为以下几个阶段&#x…

SprinBoot+Vue个性化旅游推荐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

C语言深度剖析--不定期更新的第三弹

hello,everybody!最近又更新了哈&#xff0c;希望对大家有所帮助 switch case关键字 基本语法&#xff1a; switch(整型变量/常量/整型表达式){case 1:var 1;break;case 2:var 2;break;case 3:var 3;break;default:break; }switch case语句也和if语句一样具有判断和分支的功…

挂轨巡检机器人在发电厂与煤矿皮带机场景的应用

一、引言 在发电厂和煤矿等重工业领域&#xff0c;皮带机作为关键设备&#xff0c;其运行状态直接关系到生产效率和安全。然而&#xff0c;传统的人工巡检方式不仅效率低下&#xff0c;还存在安全隐患。随着智能巡检技术的不断发展&#xff0c;杭州旗晟智能科技有限公司推出的…

Git学习尚硅谷(003 git分支操作)

尚硅谷Git入门到精通全套教程&#xff08;涵盖GitHub\Gitee码云\GitLab&#xff09; 总时长 4:52:00 共45P 此文章包含第15p-第p18的内容 文章目录 git分支操作分支介绍分支的好处 分支的操作查看分支创建分支切换分支&修改分支合并分支正常合并分支冲突合并 git分支操作…

如何打造在线音乐网站?java springboot架构,vue前端开发,音乐分享新体验

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

二、Maven工程的构建--JavaSEJavaEE

idea构建Maven JavaSE工程&#xff1a; idea构建Maven JavaEE工程&#xff1a; &#xff08;1&#xff09;手动创建 &#xff08;2&#xff09;插件方式创建 在idea里安装插件JBLJavaToWeb&#xff1b; 选择需要生成的项目文件后&#xff0c;右击&#xff1a; 项目的weba…

WPF在MVVM架构下使用DataGrid并实现行删除

一、效果演示 二、Model创建 //User&#xff1a;用于绑定DataGrid控件的数据 private ObservableCollection<User> _users new ObservableCollection<User>();public ObservableCollection<User> Users{get { return _users; }set { _users value; }}//Sel…

科研绘图系列:R语言折线图(linechart plots)

文章目录 介绍加载R包导入数据数据预处理画图组合图形介绍 在R语言中,折线图(Line Plot)是一种常用的数据可视化类型,用于展示数据随时间或有序类别变化的趋势。折线图通过连接数据点来形成一条或多条线,这些线条可以清晰地表示数据的变化方向、速度和模式。 加载R包 k…

iOS——APP启动流程

APP启动 APP启动主要分为两个阶段&#xff1a;pre-main和main之后&#xff0c;而APP的启动优化也主要是在这两个阶段进行的。 main之后的优化&#xff1a;1. 减少不必要的任务&#xff0c;2.必要的任务延迟执行&#xff0c;例如放在控制器界面等等。 APP启动的大致过程&#…

数字化转型的关键指南:《数字化专业知识体系》深度剖析应用策略

数字化浪潮下的企业生存法则 随着全球企业加速数字化转型&#xff0c;如何有效应对技术变革带来的挑战和机遇成为各行业关注的焦点。传统的IT管理模式已经无法满足日益复杂的数字化需求&#xff0c;亟需一种新型、综合的知识体系来引导企业迈向成功。《数字化专业知识体系》&a…

企业如何组建安全稳定的跨国通信网络?

组建一个安全稳定的跨国通信网络对于现代企业来说至关重要&#xff0c;尤其是当企业在全球范围内运营时。以下是一些关键步骤和考虑因素&#xff1a; 需求分析&#xff1a; 确定企业的具体通信需求&#xff0c;包括带宽要求、延迟敏感度、数据类型&#xff08;如语音、视频、文…

生日贺卡录放音芯片,多段音频录音ic生产厂商,NVF04M-32minute

可以录音播放的生日贺卡与传统的纸质贺卡相比&#xff0c;它有着创意以及个性的特点&#xff0c;仅需少量的电子元器件&#xff0c;即可实现录音功能&#xff0c;搭配上文字&#xff0c;让声音存储在生日贺卡里&#xff0c;让贺卡也变得有温度&#xff0c;祝福我想亲口对TA说。…

(二)ASP.NET Core WebAPI项目的启动地址设置

上一篇介绍了ASP.NET Core WebAPI项目创建&#xff0c;可参考&#xff1a; 1.webAPI的访问地址 1) 启动时&#xff0c;选择CoreWebAPI(项目名称)运行项目 可以看到打开浏览器后的地址是&#xff1a;applicationUrl"\"launchUrl 2) 启动时&#xff0c;选择IIS Expre…

仿论坛项目--Kafka,构建TB级异步消息系统

阻塞队列 • BlockingQueue 解决线程通信的问题。阻塞方法&#xff1a;put、take。 • 生产者消费者模式生产者&#xff1a;产生数据的线程。消费者&#xff1a;使用数据的线程。 • 实现类ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue、SynchronousQueue、D…

仕考网:事业编面试全流程介绍

1.进入考场 工作人员会检查考生的身份证、准考证以及随身携带物品&#xff0c;可以带食物和水 2.进入候考室 进入候考室&#xff0c;工作人员会再次确认考生信息 3.抽签 考生到齐后&#xff0c;工作人员会组织考生抽签&#xff0c;登记抽签序号、信息确认、发放号码牌 4.…

基于IMX6ULL的Cortex-A中断原理讲解,以及编写其中断向量表

首先借助STM32我们需要了解中断系统是如何构成的 会有一个中断源&#xff0c;也就是能够向CPU发出中断请求的设备或事件。中断源不分硬件和软件&#xff0c;也就是产生中断信号&#xff0c;就会执行中断服务函数 但是CPU是如何知道中断源产生后就找到对应的中断…

springboot+vue+mybatis智慧篮球馆预约+PPT+论文+讲解+售后

近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;智慧篮球馆预约利用计算机网络实现信息化管理&#xff0c;使整个智慧篮球馆预约的发展和服务水平有显著提升。 本文拟采用Eclipse开发…