【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.mfbz.cn/a/595636.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

动力电池热管理方案介绍与发展方向

摘要 随着电动汽车的快速发展&#xff0c;高性能的动力电池系统成为推动电动汽车产业发展的重要因素。然而&#xff0c;伴随着能量密度提高和放电深度增加&#xff0c;电池热管理问题逐渐凸显。良好的热管理方案能够提高电池的寿命&#xff0c;保障电池性能&#xff0c;延长电…

4.堆_树(汇总版)

目录 1.树概念及结构 1.1树的概念 1.2 树的相关定义 1.3 树的表示 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树 2.3 特殊的二叉树 2.4 二叉树的性质 2.5 二叉树的存储结构 3.二叉树的顺序结构及实现 3.1 二叉树的顺序结构--堆 3.2 堆的实现 3.2.1打印 3.2.2 …

el-select 点击按钮滚动到选择框顶部

主要代码是在visibleChange 在这个 popper 里面找到 .el-select-dropdown__list let popper ref.$refs.popper const ref this.$refs.select let dom popper.querySelector(.el-select-dropdown__list) setTimeout(() > { dom.scrollIntoView() }, 800) <templat…

Debian mariadb 10.11设定表名 大小写不敏感方法

目录 问题表现&#xff1a;应用中查询 表提示 表不存在 处理步骤&#xff1a; 1、查询表名大小写敏感情况&#xff1a; show global variables like %case%; 2、修改mariadb 配置设置大小写 不敏感 mysql 配置大小写不敏感 mariadb 10.11设置表名大小写不敏感 /etc/mysq…

【项目部署】手把手带你从零部署项目:宝塔 + uwsgi + Django + 腾讯云 + Websocket

1. 前言 哈喽&#xff0c;大家好&#xff0c;我是jiaoxingk。今天带来的是有关Django项目部署的教程。 当我们完成了一个项目作品之后&#xff0c;我们肯定会迫不及待的就准备上线部署啦&#xff0c; 这篇教程将带你从服务器的配置选购&#xff0c;再通过安装宝塔的形式进行项目…

【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点

力扣对应题目链接&#xff1a;LCR 140. 训练计划 II - 力扣&#xff08;LeetCode&#xff09; 核心考点 &#xff1a;链表&#xff0c;前后指针的使用&#xff0c;边界条件检测。 一、《剑指Offer》内容 二、分析问题 较优解题思路&#xff1a; 题目中的链表是单链表&#xff0…

数据库SQL语言实战(七)

前言 这次的有一点点难~~~~~我也写了好久 练习题 题目一 在学生表pub.student中统计名字&#xff08;姓名的第一位是姓氏&#xff0c;其余为名字&#xff0c;不考虑复姓&#xff09;的使用的频率&#xff0c;将统计结果放入表test5_01中 create table test5_01(First_name…

Mars3d实现用一个button控制一个map.control的显示与隐藏

原生js,想做一个button,控制比如compass的显示与隐藏 点一下显示 再次单击的时候就隐藏掉 写了一个function控制显示隐藏 function addCompass(){ if(compass.showtrue) { compass.showfalse; } else{ compass.showtrue; } } 功能示例(Vue版) | Mars3D三维可视化平台 | 火星…

corCTF2023 -- kcipher

前言 本次仅仅是通过 modprobe_path 拿 flag&#xff0c;但是 modprobe_path 是可以提权的&#xff08;&#xff1a;只需要把 /etc/passwd 的权限修改为 777 即可 这里存在 kmalloc-96 大小的 UAF/Double free 所以其实利用方式挺多的~~~但是这里就不深究了 题目分析 内核版…

实测好评!微信自动回复消息神器!高效沟通拿捏住!

随着企业规模的扩大和客户数量的增加&#xff0c;有效管理和回复每一条消息变得越来越具有挑战性。今天&#xff0c;就给大家分享一个高效的自动回复消息神器——个微管理系统&#xff0c;让你能够轻松应对各种沟通需求。 1、自动通过好友&#xff0c;提高沟通效率 每当有新的…

Shell脚本编写-定时清空文件内容,定时记录文件内容大小

find命令 – 根据路径和条件搜索指定文件 – Linux命令大全(手册)find命令的功能是根据给定的路径和条件查找相关文件或目录&#xff0c;其参数灵活方便&#xff0c;且支持正则表达式&#xff0c;结合管道符后能够实现更加复杂的功能&#xff0c;是Linux系统运维人员必须掌握的…

基于现有语言大模型,定制“人人AI气象”公众号天气助手

最近&#xff0c;月之暗面的Kimi大模型非常受欢迎&#xff0c;尝试用了moonshot(128K)基座模型&#xff0c;通过调用各种公开渠道的API&#xff0c;简易实现了一个天气助手&#xff0c;可以回答天气相关的基础概念、原理、应用等方面的问题&#xff0c;同时也可调用多个插件获取…

ComfyUI搭建和注意事项for WIN[笔记]

下载ComfyUI(GitHub - comfyanonymous/ComfyUI: The most powerful and modular stable diffusion GUI, api and backend with a graph/nodes interface.) 从源码上搭建比较麻烦&#xff0c;一般不推荐&#xff0c;所以跑到release里面找一个下载。我的显卡是GeFore GTX 1050 …

【ITK统计】第一期 分类器

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享ITK中的分类器及其使用情况,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 在统计分…

私域流量引流方式有哪些?

私域流量引流的方法无非是营销渠道投放、各平台KOL投放、自有自媒体平台账号内容引流、线下引流、老客户转介绍裂变等几个方面&#xff0c;下面对各种不同方法进行简单介绍。 1、营销渠道投放&#xff1a;选择广点通、粉丝通、某些app的信息流和dou等大平台自带的推广渠道工具…

JavaScript中的事件模型

JavaScript中的事件模型分为&#xff1a;事件和事件流、原始事件、标准事件和IE事件。 事件与事件流 JavaScript中的事件&#xff0c;可以理解为HTML文档或者浏览器中发生的一种交互操作&#xff0c;让网页有互动的功能。常见的事件就是加载事件、鼠标事件和自定义事件。 因…

JavaScript中Math函数与舍入

立方根 console.log(Math.sqrt(25)); //数学方式25平方根 console.log(25 ** (1 / 2)); //25的0.5次方 console.log(8 ** (1 / 3)); //8的1/3次方计算最大最小值 console.log(Math.max(1, 5, 88, 22, 132)); //返回最大值 console.log(Math.max(1, 5, 88, 22, 132)); //…

STM32CubeMX学习笔记29---FreeRTOS任务通知

一、简介 1 、基本概念 FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能&#xff0c;每个任务都有 一个 32 位 的通知值&#xff0c;在大多数情况下&#xff0c;任务通知可以 替代二值信号量、计数信号量、事件组&#xff0c;也可以替代长度为 1 的队列&#xff08;可以保存…

wordpress外贸建站公司歪建站新版网站上线

wordpress外贸建站公司 歪猫建站 歪猫WordPress外贸建站&#xff0c;专业从事WordPress多语言外贸小语种网站建设与外贸网站海个推广、Google SEO搜索引擎优化等服务。 https://www.waimaoyes.com/dongguan

一键 input 苹果 OpenELM,零门槛 Llama 3 教程,40+ 优质模型/数据集/教程,建议收藏!...

现在 AI 行业什么最火&#xff1f; 「大模型」一定仍然排在前三甲的位置。 自从 2022 年底 ChatGPT 面世以来&#xff0c;大模型在各行各业已经带来了太多的惊喜&#xff0c;应用场景愈发丰富&#xff0c;同时也带动了相关底层技术的普及与普适化。尤其是在开源模型繁荣发展之下…
最新文章