C++ 标准库类型vector

C/C++总述:Study C/C++-CSDN博客 

目录

容器特性 

1.顺序序列

2.动态数组

3.能够感知内存分配器的(Allocator-aware)

定义和初始化vector对象

vector的增

vector的删

vector的改

vector中元素的访问

vector的大小与容量


标准库中的 vector 是一种动态数组,能够提供快速随机访问和元素插入/删除。它是 C++ STL(标准模板库)中的一部分,用于存储一系列元素。

#include<vector>
using std::vector;

容器特性 

1.顺序序列

顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

2.动态数组

支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。提供了在序列末尾相对快速地添加/删除元素的操作。

3.能够感知内存分配器的(Allocator-aware)

容器使用一个内存分配器对象来动态地处理它的存储需求。

定义和初始化vector对象

  • vector():创建一个空vector
vector<int>nums;//创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
vector<int>nums(10);//创建10个元素的vector
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
vector<int>nums(10,0);//创建10个元素的vector,并初始化.
  • vector(const vector&):复制构造函数
vector<int>v4(v3);//复制构造函数
  • vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
vector<int>v2(v1.begin(),v1.end());//复制[begin,end)区间内另一个数组的元素到vector中

vector的增

  • void push_back(const T& x):向量尾部增加一个元素X
    v1.push_back(9);//向向量尾部增加一个元素整数9
    
  • iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x 
    iterator it =v1.begin()+3;//定义it迭代器,it指向v1第4个元素
    v1.insert(it,9);//在迭代器it前增加1个数9
    
  • iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x 
     
    iterator it =v1.begin()+3;//定义it迭代器,it指向v1第4个元素
    v1.insert(it,2,9);//在迭代器it前增加2个数9
    
  • iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
    iterator it =v1.begin()+3;//定义it迭代器,it指向v1第4个元素
    v1.insert(it,2,v2.begin(),v2.end());//在迭代器it前增加v2整个数据
    

vector的删

  • iterator erase(iterator it):删除向量中迭代器指向元素
    iterator it=v1.begin()+3;//定义it迭代器,it指向v1第4个元素
    v1.erase(it+1);//删除it后面的元素
    
  • iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
    iterator it=v1.begin();//定义it迭代器,it指向v1第1个元素
    v1.erase(it,it+3);//删除v1前四个元素
    
  • void pop_back():删除向量中最后一个元素
    v1.pop_back();//删除v1最后一个元素
    
  • void clear():清空向量中所有元素
    v1.clear();//清除向量中所有元素
    

vector的改

  • void swap(vector&):交换两个同类型向量的数据
    v1.swap(v2);//交换v1和v2的数据
  • void assign(int n,const T& x):设置向量中前n个元素的值为x
    v1.assign(9,5);//设置前5个元素值为9
    
  • void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素
    v1.assign(it,v1.begin()+1,v1.end()-1);//从指定开始到指定结尾设置为it指向的元素
    

vector中元素的访问

  • reference at(int pos):返回pos位置元素的引用
    v1.at(5);//返回v1[5]的元素引用
    
  • reference front():返回首元素的引用
    v1.front();//返回第一个元素的引用
    
  • reference back():返回尾元素的引用
    v1.back();//返回最后一个元素的引用
    
  • iterator begin():返回向量头指针,指向第一个元素
    v1.begin();//返回一个迭代器,指向第一个元素
    
  • iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
    v1.end();//返回迭代器,指向最后一个元素
    
  • reverse_iterator rbegin():反向迭代器,指向最后一个元素
    v1.rbend();//反向迭代器,指向最后一个元素即end-1
    
  • reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
    v1.rend();//反向迭代器,指向第一个元素之前的位置,即begin-1

vector的大小与容量

  • int size() const:返回向量中元素的个数
    v1.size();//返回向量中元素个数
    
  • int capacity() const:返回当前向量所能容纳的最大元素值
    v1.capacity();//返回当前向量容量
    
  • bool empty() const:判断向量是否为空,若为空,则向量中无元素
    v1.empty();//判断v1是否为空,返回值为bool
    
  • int max_size() const:返回最大可允许的vector元素数量值
     
    v1.max_size();//返回最大允许vector数量
    
  • void resize ();改变当前对象的有效字符的个数
    resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
    resize(int num,int elem); //重新指定容器的长度为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超过容器长度的元素被删除
  • void reserve ();改变当前对象的容量大小
    void reserve (size_t n = 0);//当n大于对象当前的capacity时,将capacity扩大到n或大于n;当n小于对象当前的capacity时,什么也不做

vector的模拟实现

#include<assert.h>
#include<string.h>
#include<iostream>
using namespace std;
namespace  simulation
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;iterator begin(){return _start;}iterator end(){return _finish;}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}size_t size() const{return _finish - _start;}size_t capacity() const{return _endofstorage - _start;}template <class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);first++;}}vector(size_t n, const T& val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}vector(int n, const T& val = T()){reserve(n);for (int i = 0; i < n; i++){push_back(val);}}vector():_start(nullptr), _finish(nullptr), _endofstorage(nullptr){}vector(const vector<T>& v):_start(nullptr), _finish(nullptr), _endofstorage(nullptr){reserve(v.capacity());for (auto& e : v){push_back(e);}}vector<T>& operator=(vector<T> tmp){swap(tmp);return *this;}void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_endofstorage, v._endofstorage);}~vector(){delete[] _start;_start = _finish = _endofstorage = nullptr;}T& operator[](size_t pos){assert(pos < size());return _start[pos];}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) * sz);for (size_t i = 0; i < sz; i++){tmp[i] = _start[i];}delete[] _start;}_start = tmp;_finish = _start + sz;_endofstorage = _start + n;}}void resize(size_t n, const T& val = T()){if (n <= _finish){_finish = _start + n;}else{reserve(n);while (n + _start > _finish){*_finish = val;_finish++;}}}void  push_back(const T& x){if (_finish == _endofstorage){reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;_finish++;}void insert(iterator pos, const T& x){assert(pos >= _start);assert(pos <= _finish);if (_finish == _endofstorage){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 = x;_finish++;}iterator erase(iterator pos){assert(pos >= _start);assert(pos <= _finish);iterator it = pos + 1;while (it < _finish){*(it - 1) = *it;++it;}_finish--;return pos;}private:iterator _start;iterator _finish;iterator _endofstorage;};
}

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

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

相关文章

RUST 中什么情况下要使用 .unwrap ( )

在Rust编程语言中&#xff0c;.unwrap() 方法主要应用于处理 Result 或 Option 类型。这两种类型常用于处理可能会出现错误或缺失值的情况。 Result<T, E>: 当你有一个 Result 类型的变量&#xff0c;并且你知道或者期望它一定是 Ok 值&#xff08;即不包含错误&#xf…

ROS 基本

ROS创建自己的功能包 ROS中工作空间(workspace)是一个存放工程开发相关文件的文件夹&#xff0c;其中有四个文件夹。 src:代码空间(Source Space)build:编译空间(Build Space)devel:开发空间(Development Space)install:安装空间(Install Space) OK接下来创作工作空间&#…

新能源微电网数据集

需要的同学私信联系&#xff0c;推荐关注上面图片右下角的订阅号平台 自取下载。 微电网&#xff08;Micro-Grid&#xff0c;MG&#xff09;由分布式电源&#xff08;分布式光伏、分散式风电、燃气轮机、电化学储能、超级电容等&#xff09;、用电负荷&#xff08;重要、可调等…

SpringCloud学习(2)-OpenFeign

1.OpenFeign简介 Feign是一个声明式的Web服务客户端&#xff08;Web服务客户端就是Http客户端&#xff09;&#xff0c;让编写Web服务客户端变得非常容易&#xff0c;只需创建一个接口并在接口上添加注解即可。 cloud官网介绍Feign&#xff1a;Spring Cloud OpenFeign OpenF…

【Prometheus】关于Prometheus告警的一些使用心得

关于Prometheus告警的一些使用心得 指标规整及联动判定告警多条件判断告警路由分组和接受者以URL参数区分的多个Webhook的配置使用Alertmanger的API 之前一直有在用Prometheus的规则引擎配一些告警&#xff0c;感觉内容还是比较多&#xff0c;做一下整理&#xff0c;方便以后用…

3D怎么看模型内部结构---模大狮模型网

在3D建模和设计过程中&#xff0c;了解模型的内部结构是十分重要的。这不仅有助于审美和设计&#xff0c;还能够帮助我们更好地理解模型的构造和特性。模大狮将介绍一些方法和技巧&#xff0c;帮助您探索3D模型的内部结构。 一、使用切片工具 切片模型&#xff1a;通过切片工具…

手机销量分析案例

项目背景 某电商商城随着业务量的发展&#xff0c;积累了大量的用户手机销售订单数据。决策层希望能够通过对这些数据的分析了解更多的用户信息及用户的分布&#xff0c;从而可以指导下一年的市场营销方案以及更加精准的定位市场&#xff0c;进行广告投放。 数据说明 数据时…

等变GNN

非空集合 G G G上定义的二元运算如果满足某些性质&#xff0c;就构成了一个群。常见的群有&#xff1a; O ( n ) O(n) O(n)&#xff1a; n n n维正交群&#xff0c;包含旋转和反演操作&#xff0c;反演可以理解为推理或者映射。 S O ( n ) SO(n) SO(n)&#xff1a; n n n维特殊…

【学习笔记】java项目—苍穹外卖day04

文章目录 1. 新增套餐1.1 需求分析和设计1.2 代码实现1.2.1 DishController1.2.2 DishService1.2.3 DishServiceImpl1.2.4 DishMapper1.2.5 DishMapper.xml1.2.6 SetmealController1.2.7 SetmealService1.2.8 SetmealServiceImpl1.2.9 SetmealMapper1.2.10 SetmealMapper.xml1.…

Web攻击越发复杂,企业如何保护云上业

如今&#xff0c;电子政务、电子商务、网上银行、网上营业厅等依托Web应用&#xff0c;为广大用户提供灵活多样的服务。在这之中&#xff0c;流量攻击堪称是Web应用的最大敌人&#xff0c;黑客通过流量攻击获取利益、竞争对手雇佣黑客发起恶意攻击、不法分子通过流量攻击瘫痪目…

MySQL中使用distinct单、多字段去重方法

目录 一、distinct 1.1 只对一个字段查重 1.2多个字段去重 1.3针对null处理 1.4与distinctrow同义 二、聚合函数中使用distinct 三、CONCAT_WS函数 多个字段拼接去重是指将多个字段的值按照一定的规则进行拼接&#xff0c;并去除重复的拼接结果。这样可以生成唯一标识符…

【中大厂前端面试百问】这不迷死你?

写在前面 最近收到很多同行的抱怨&#xff0c;前端开发高级还行&#xff0c;对初中级最难过的不是面试过不去&#xff0c;而是“已读不回”&#xff0c;来自某聘的梗&#xff0c;确实是&#xff0c;初中级因为坑位较少&#xff0c;很多HR在专心招聘的时候都未必能让所有投简历…

TikTok账号为什么被封?如何防止被封?

多人在使用TikTok的过程中都会遇到一些问题&#xff0c;比如为什么TikTok没有浏览量&#xff1f;事实上&#xff0c;这很可能是因为你的账号已被禁止。但为什么它会被封呢&#xff1f;你怎样才能解决它&#xff1f; 一、TikTok账号为什么被封&#xff1f; 1、什么是 TikTok 影…

TikTok账号封号原因是什么?全面攻略

多人在使用TikTok的过程中都会遇到一些问题&#xff0c;比如为什么TikTok没有浏览量&#xff1f;事实上&#xff0c;这很可能是因为你的账号已被禁止。但为什么它会被封呢&#xff1f;你怎样才能解决它&#xff1f; 一、TikTok账号为什么被封&#xff1f; 1、什么是 TikTok 影…

本地项目提交到远程服务器的git流程

初入职场的开发小白或多或少都会遇到一些使用git来管理项目的问题&#xff0c;这里给大家浅浅的总结一下大致的提交流程 具体步骤如下&#xff1a; 将当前目录下的所有修改的文件添加到暂存区 git add .提交暂存区文件到本地仓库中 描述的内容就是你本次提交的一些相关说明 …

数据结构与算法(2)顺序表的初始化、插入、打印、删除、查找元素——C语言版

目录 1.前言 2.头文件的定义 3.菜单栏的设置 4.顺序表的初始化 5.添加元素 6.打印元素 7.查找元素 8.删除元素 9.插入元素 10.主函数 11.完整的代码实现 1.前言 数据结构包括三个方面 逻辑结构存储结构运算 而线性表有两种典型的存储结构 顺序存储结构链式存储结构 具体关系可…

idea端口占用

报错&#xff1a;Verify the connector‘s configuration, identify and stop any process that‘s listening on port XXXX 翻译&#xff1a; 原因&#xff1a; 解决&#xff1a; 一、重启大法 二、手动关闭 启动spring项目是控制台报错&#xff0c;详细信息如下&#xff…

openGauss 访问控制模型

访问控制模型 可获得性 本特性自openGauss 1.1.0版本开始引入。 特性简介 管理用户访问权限&#xff0c;为用户分配完成任务所需要的最小权限。 客户价值 客户依据自身需求创建对应的数据库用户并赋予相应的权限给操作人员&#xff0c;将数据库使用风险降到最低。 特性描…

Compose Navigation导航使用的部分注意事项

文章目录 一、前言二、使用判断条件进行显示隐藏和Navigation的区别三、Navigation和ViewModel的关系四、Navigation中替换页面的方式 一、前言 在Android的项目架构中有一种由单个Activity&#xff0c;多个页面组成的架构。页面之前是由Fragment来承载显示&#xff0c;现在可…

Photoshop 2024 Mac/win---图像处理的新纪元,解锁无限创意

Photoshop 2024是一款功能强大的图像处理软件&#xff0c;以其卓越的性能和广泛的应用领域&#xff0c;赢得了设计师、摄影师、图形艺术家等各类创意工作者的青睐。它提供了丰富的绘画和编辑工具&#xff0c;让用户能够轻松进行图片编辑、合成、校色、抠图等操作&#xff0c;实…