【C++】Vector详解

Vector是什么?

  • vector是C++(STL)中的一种序列容器
  • Vector是一个动态数组,内存空间是连续的,支持随机访问,支持迭代器访问

Vector代码实现

变量指向

image.png

代码初始化
#include<iostream>
using namespace std;
#include<assert.h>
#include<vector>namespace xiaofeng
{template<class T>class vector{public:typedef T* iterator;//迭代器typedef const T* const_iterator;//反向迭代器//初始化vector():_start(nullptr) , _finish(nullptr), _end_of_storage(nullptr){}private:iterator _start;//begin 起始位置iterator _finish;//end 数据结束位置iterator _end_of_storage;//capacity  总大小};
起始与结束位置

image.png

//vtor的起始位置
iterator begin()
{return _start;
}//vtor的结束位置
iterator end()
{return _finish;
}
//反向迭代器 vtor的起始位置
const_iterator begin()const//匹配权限
{return _start;
}//反向迭代器 vtor的结束位置
const_iterator end()const
{return _finish;
}
resize

image.png

//size  capacity都扩容
//改变整体的大小void resize(size_t n, T val = T())//T()相当于int()   内置类型有没有构造函数 int i = int();
{if (n < size()){_finish = _start + n;}else{if (n > capacity()) //总体内存不够需要扩容capacity{reserve(n);}while (_finish != _start + n)//填充{*_finish = val;++_finish;}}}
reverse

image.png

//size 不变, capacity扩容
//虚拟扩容
//n==10 capacity==5
//避免扩容空间不足
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());//从_start拷贝size字节到tmp  取一块新的地址delete[] _start;}_start = tmp;_finish = _start + sz;_end_of_storage = _start + n;}
}
push_back

image.png

void push_back(const T& x)//模板自动匹配类型
{if (_finish == _end_of_storage){reserve(capacity() == 0 ? 4 : capacity() * 2); //判断capacity是否为空,空就==4 非空扩容两倍}*_finish = x;//插入++_finish;
}
pop

image.png

void pop_back()
{assert(!empty());--_finish;
}
insert

image.png

//迭代器失效,野指针,异地扩容
iterator insert(iterator pos, const T& val)
{assert(pos >= _start);assert(pos <= _finish);if (_finish == _end_of_storage){size_t len = pos - _start;//会异地扩容,因为要先记录相对位置reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len;}iterator end = _finish - 1;while (end >= pos)//向后移动一位腾出空间{*(end + 1) = end;--end;}*pos = val;//插入++_finish; //更新size大小return pos;}
erase

image.png

//头删
void erase(iterator pos)
{assert(pos >= _start);assert(pos < _finish);iterator start = pos + 1; //把_start后一个数据往前移动while (start != _finish){*(start + 1) = *start;++start;}--_finish;//设置大小}
capacity
//计算capacity的大小
size_t capacity()const//不改变的直接用const
{return _end_of_storage - _start;
}
size
//计算size大小
size_t size()const
{return _finish - _start;
}
empty
bool empty()
{return  _finish == _start;
}
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];
}

测试用例

插入与删除
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);//func(v1);
cout << "push_back()" << endl;for (size_t i = 0; i < v1.size(); i++)
{cout <<  v1[i] << endl;
}v1.pop_back();
v1.pop_back();
v1.pop_back();
v1.pop_back();
cout << "pop()"<< endl;for (size_t i = 0; i < v1.size(); i++)
{cout <<  v1[i] << endl;
}

image.png

扩容
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);cout <<"size:" << v1.size() << endl;
cout << "capacity:" <<v1.capacity() << endl;v1.reserve(100);
cout << "reserve-->size:" << v1.size() << endl;
cout << "reserve-->capacity:" << v1.capacity() << endl;v1.resize(1);
cout << "resize-->size:" << v1.size() << endl;
cout << "resize-->capacity:" << v1.capacity() << endl;

image.png

迭代器失效
std::vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
//v1.push_back(5);
for (auto e : v1)
{cout << e << " ";
}
cout << endl;auto pos = find(v1.begin(), v1.end(), 3);
if (pos != v1.end())
{//v1.insert(pos, 30);pos = v1.insert(pos, 30);
}for (auto e : v1)
{cout << e << " ";
}
cout << endl;
//迭代器失效问题
// insert以后我们认为pos失效了,不能再使用
(*pos)++;
*(pos+1)++;for (auto e : v1)
{cout << e << " ";
}
cout << endl;

image.png

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

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

相关文章

【教程向】从零开始创建浏览器插件(四)探索Chrome扩展的更多常用API

探索Chrome扩展的更多常用API 在Chrome扩展开发中&#xff0c;除了最基础的API外&#xff0c;Chrome还提供了一系列强大的API&#xff0c;允许开发者与浏览器的各种功能进行交互。本文将介绍其中几个常用的API&#xff0c;并提供详细的示例代码帮助您开始利用这些API。 书签…

XSS-Labs 靶场通过解析(下)

前言 XSS-Labs靶场是一个专门用于学习和练习跨站脚本攻击&#xff08;XSS&#xff09;技术的在线平台。它提供了一系列的实验场景和演示&#xff0c;帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 XSS-Labs靶场的主要特点和功能包括&#xff1a;…

VMware虚拟机中Linux系统奔溃,怎么办?

一大早启动虚拟机准备开始工作&#xff0c;却遭遇到Linux系统崩溃&#xff0c;屏幕上显示以下错误提示&#xff1a; 这段文本看起来是来自系统引导时的日志信息&#xff0c;提到了一些关于文件系统的问题和建议。根据这段信息&#xff0c;似乎 /dev/sda1 分区中的文件系统存在一…

STM32入门周边知识(为什么要装MDK,启动文件是什么,为什么要配置时钟等等)

目录 MDKMDK与C51共存为什么要安装MDK 启动文件是什么&#xff0c;为什么要添加许多文件为什么要添加头文件路径为什么是寄存器配置魔术棒中的define为什么必须先配置时钟杂例 MDK MDK与C51共存 在最开始学习51单片机的时候&#xff0c;当时安装keil的时候&#xff0c;认为就是…

### 【数据结构】线性表--顺序表(二)

文章目录 1、什么是线性表2、线性表的基本操作3、顺序表3.1、顺序表的定义3.2、顺序表的实现方式&#xff1a;静态分配3.3、顺序表的实现方式&#xff1a;动态分配3.4、顺序表的特点3.5、顺序表的初始化与插入操作3.6、顺序表的删除与查询 1、什么是线性表 ​ 线性表是具有相同…

Vue3自定义封装音频播放组件(带拖拽进度条)

Vue3自定义封装音频播放组件&#xff08;带拖拽进度条&#xff09; 描述 该款自定义组件可作为音频、视频播放的进度条&#xff0c;用于控制音频、视频的播放进度、暂停开始、拖拽进度条拓展性极高。 实现效果 具体效果可以根据自定义内容进行位置调整 项目需求 有播放暂停…

云原生周刊:Terraform 1.8 发布 | 2024.5.6

开源项目推荐 xlskubectl 用于控制 Kubernetes 集群的电子表格。xlskubectl 将 Google Spreadsheet 与 Kubernetes 集成。你可以通过用于跟踪费用的同一电子表格来管理集群。 git-sync git-sync 是一个简单的命令&#xff0c;它将 git 存储库拉入本地目录&#xff0c;等待一…

WebRtc 视频通话,语音通话实现方案

先了解一下流程 和 流程图(chatGpt的回答) 实现 (底层代码实现, 可作为demo熟悉) 小demo <template><div><video ref"localVideo" autoplay muted></video> <!-- 本地视频元素&#xff0c;用于显示本地视频 --><video ref"r…

【笔试训练】day23

一、打怪 思路 由于是先手攻击&#xff0c;如果一次攻击就能杀死小怪&#xff0c;那么说明可以为无限杀小怪。 再计算杀一只小怪要扣多少血就好了&#xff0c;再用总生命值去除这个扣血量&#xff0c;得到的就是最多杀死小怪的数量。注意&#xff0c;由于最后一定要活下来&am…

Mysql中表的创建以及数据类型

DDL 在表结构的操作 表的创建 creat table 表名&#xff08; 字段1 字段类型 [约束] &#xff0c; 字段2 字段类型 [约束] &#xff09;[comment 标注释]; create table tb_user(id int comment ID,一行字段的唯一标识,username varchar(20) comment 用户名,name varchar(…

Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)

0x01 产品简介 Mura CMS(Content Management System)是一款用于创建和管理网站内容的开源内容管理系统。它具有许多功能和灵活性,使其成为许多网站开发者和内容创作者的首选工具。是一个强大的企业网站解决方案,可用于创建和管理公司网站、产品目录、新闻发布、客户支持和…

当AI遇见现实:数智化时代的人类社会新图景

文章目录 一、数智化时代的机遇二、数智化时代的挑战三、如何适应数智化时代《图解数据智能》内容简介作者简介精彩书评目录精彩书摘强化学习什么是强化学习强化学习与监督学习的区别强化学习与无监督学习的区别 前言/序言 随着科技的日新月异&#xff0c;我们步入了一个前所未…