C++初阶——vector

一、什么是vector

        vector是表示可变大小的数组的序列容器,就像数组一样,vector也采用连续空间来存储元素。也就是说它的访问和数组一样高效,但是它的大小是动态可变的,并且它的大小会被容器自动处理

二、vector的构造

        常用的构造函数:

构造函数声明接口声明
vector()无参构造函数
vector(size_type n, const value_type& val=value_type())构造并初始化n个val
vector(const vector& x)拷贝构造函数
vector(InputIterator first,InputIterator last)使用迭代器进行初始化构造

        笔者想要特别提一下这种构造方式:

vector(size_type n, const value_type& val=value_type())

         这里如果没有显式提供要初始化实例,则会调用该类型的默认构造函数进行初始化,如果是整型则会默认初始化为0,如果是自定义类型:

#include<iostream>
#include<vector>
#include<string>
using namespace std;
class A
{
public:int a;int b;int c;A():a(1),b(2),c(3){}
};
int main()
{A k;k.a = 4;k.b = 3;vector<A> v1(1,k);cout << v1[0].a << " " << v1[0].b << " " << v1[0].c << endl;vector<A> v2(1);cout << v2[0].a << " " << v2[0].b << " " << v2[0].c << endl;return 0;
}

 输出结果为:

        可以看到,如果是自定义类型给出第二个参数会进行拷贝构造,不给则会进行默认构造。 

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1;//无参构造vector<int> v2(10, 1);//构造并初始化为1vector<int> v3(10);//构造,不给参数会根据元素的类型进行默认初始化vector<int> v4(v2);//拷贝构造string s1("hello world");vector<int> v5(s1.begin(), s1.end());//这样可行吗?里面存储的是什么?
}

三、vector的迭代器

iterator的使用接口说明
begin+endbegin获取第一个数据的位置,end获取最后一个数据的下一个位置
rbegin+rendrbegin获取最后一个数据的位置,rend获取第一个数据的前一个位置

函数原型:

iterator begin() noexcept;
const_iterator begin() const noexcept;iterator end() noexcept;
const_iterator end() const noexcept;reverse_iterator rbegin() noexcept;
const_reverse_iterator rbegin() const noexcept;reverse_iterator rend() noexcept;
const_reverse_iterator rend() const noexcept;

 迭代器的使用:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{int k = 0;vector<int> v1(10);for (auto& i : v1){i += k;++k;}vector<int>::iterator it = v1.begin();//auto it = v1.begin()也可以写成这样while (it != v1.end()){cout << *it << " ";++it;}cout << endl;vector<int>::reverse_iterator it2 = v1.rbegin();while (it2 != v1.rend()){cout << *it2 << " ";++it2;}
}

 输出结果为:

四、vecotr的容量

容量空间接口说明
size获取已存在的数据的个数
capacity获取最多能容纳的数据的个数
empty判断容器是否为空
resize改变vector的size
reserve改变capacity或者预留空间

函数原型:

size_type size() const noexcept;size_type capacity() const noexcept;bool empty() const noexcept;void resize (size_type n);
void resize (size_type n, const value_type& val);void reserve (size_type n);

 容量相关的函数使用:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1(10,1);cout << "初始:" <<endl;cout << "v1.size():" << v1.size() << endl;cout << "v1.capacity():" << v1.capacity() << endl;v1.reserve(20);cout << "扩容:" << endl;cout << "v1.size():" << v1.size() << endl;cout << "v1.capacity():" << v1.capacity() << endl;v1.reserve(5);cout << "reverse减少空间:" << endl;cout << "v1.size():" << v1.size() << endl;cout << "v1.capacity():" << v1.capacity() << endl;v1.resize(5);cout << "resize减少空间:" << endl;cout << "v1.size():" << v1.size() << endl;cout << "v1.capacity():" << v1.capacity() << endl;
}

 输出结果:

     可以发现,reverse函数只能扩容,不能进行容量缩减,resize函数可以减少size但是不能改变分配的内存空间的大小。   

五、vector的增删查改   

crud函数接口说明
push_back在尾部插入一个数据

       pop_back

删除尾部的一个数据
find查找一个函数第一次出现的下标,但是不是vector的成员
insert在给定的pos前插入一个元素
erase删除给定的pos位置的元素
swap交换两个vector的数据空间
operator[]能够像数组一样访问vector

函数原型:

void push_back (const value_type& val);void pop_back();template <class InputIterator, class T>InputIterator find(InputIterator first, InputIterator last, const T& value);iterator insert (const_iterator position, const value_type& val);
iterator insert (const_iterator position, size_type n, const value_type& val); 
template <class InputIterator>iterator insert (const_iterator position, InputIterator first, InputIterator last);iterator erase (const_iterator position);//擦除对应位置的一个
iterator erase (const_iterator first, const_iterator last);//擦除迭代器对应的一段void swap (vector& x);reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

函数的使用:

push_back函数与pop函数:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v(10);v.push_back(10);cout << "插入后:";for (auto i : v){cout << i << " ";}v.pop_back();v.pop_back();cout << endl;cout << "删除后:";for (auto i : v){cout << i << " ";}return 0;
}

输出结果:

find函数:

        find函数实际上是算法标准库中的一个函数,不是任何一个容器的成员函数。它返回一个迭代器,如果找到则返回对应元素的一个迭代器,否则返回传入的第二个参数,可以配合insert函数和erase函数使用。

template <class InputIterator, class T>InputIterator find(InputIterator first, InputIterator last, const T& value);
#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v = { 1,2,3,4,5,6,3,8,9 };auto it = find(v.begin(), v.end(), 3);if (it != v.end())cout << "发现" << *it << "在位置:" << it - v.begin();elsecout << "没有发现";return 0;
}

 输出结果为:

insert函数:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{int k = 0;vector<int> v(10);for (auto& i : v){i = k;++k;}vector<int> v1(10,1);vector<int> v2(10, 1);vector<int> v3(10, 1);v1.insert(v1.begin() + 2, 10);//只增加一个数据v2.insert(v2.begin()+2, 2,10);//增加自定义个数据v3.insert(v3.begin() + 2, v.begin() + 1, v.begin() + 7);//使用迭代器进行插入cout << "v1:";for (auto i : v1){cout << i << " ";}cout << endl;cout << "v2:";for (auto i : v2){cout << i << " ";}cout << endl;cout << "v3:";for (auto i : v3){cout << i << " ";}return 0;
}

输出结果为:

erase函数: 

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9 };vector<int> v2 = { 1,2,3,4,5,6,7,8,9 };v1.erase(v1.begin() + 2);cout << "v1删除后:";for (auto i : v1){cout << i << " ";}cout << endl;v2.erase(v2.begin() + 2, v2.begin() + 5);cout << "v2删除后:";for (auto i : v2){cout << i << " ";}return 0;
}

输出结果为:

swap函数: 

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1 = { 1,2,3,4,5 };vector<int> v2 = { 5,6,7,8,9 };v1.swap(v2);cout << "v1:";for (auto i : v1){cout << i << " ";}cout << endl;cout << "v2:";for (auto i : v2){cout << i << " ";}return 0;
}

输出结果:

operator[]: 

        可以通过[]像数组那样访问vector:

#include<iostream>
#include<vector>
#include<string>
using namespace std;int main()
{vector<int> v1 = { 1,2,3,4,5,6,7,8,9};for (int i = 0; i < v1.size(); ++i)cout << v1[i] << " ";return 0;
}

输出结果为:

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

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

相关文章

移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验

PC作为人们学习、办公、娱乐的重要工具&#xff0c;已经深度融入我们的工作和生活。随着物联网技术的快速发展&#xff0c;以及人们对PC性能要求的逐步提高&#xff0c;AI PC成为了行业发展的重要趋势。 11月7-8日&#xff0c;骁龙AI PC生态科技日在深圳举办。作为高通骁龙的重…

AIGC专栏17——EasyAnimate V5版本详解 应用MMDIT结构,拓展模型规模到12B 支持不同控制输入的控制模型

AIGC专栏17——EasyAnimate V5版本详解 应用MMDIT结构&#xff0c;拓展模型规模到12B 支持不同控制输入的控制模型 学习前言相关地址汇总源码下载地址HF测试链接 测试效果Image to VideoText to Video EasyAnimate详解技术储备Diffusion Transformer (DiT)Stable Diffusion 3Co…

Android Studio | 最新版本配置要求高,JDK运行环境不适配,导致无法启动App

Android Studio 的最新版本配置要求比较高&#xff0c;这时候需要降低插件的版本&#xff0c;才能正常启动项目 build.gradle 文件的 dependencies 部分中&#xff0c;使用 libs 作为一些常用库的别名。这些别名在项目的 gradle.properties 文件或者某个特定的 versions.prope…

ssm093基于Java Web的毕业生就业状况管理系统设计与实现+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;毕业生就业状况管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业生就业…

el-dialog 设置 水平垂直居中 高度不固定

小记一下&#xff1a; 希望实现不管内容高度多少 el-dialog都能水平垂直居中 效果&#xff1a; css: .form-view-dialog{display: flex;align-items: center;justify-content: center;.el-dialog{margin: 0 auto; }.el-dialog__body{max-height: 75vh; // 可选择 设置一个最…

当AI遇上时尚:未来的衣橱会由机器人来打理吗?

内容概要 在当今这个快速发展的时代&#xff0c;人工智能与时尚的结合正在逐渐改写我们对衣橱管理的认知。传统的衣橱管理常常面临着空间不足、穿搭单调及库存过多等挑战&#xff0c;许多人在挑选服饰时难以做出决策。然而&#xff0c;随着技术的进步&#xff0c;智能推荐和自…

Ubuntu 20.04安装CUDA 11.0、cuDNN 8.0.5

不知道咋弄的ubuntu20.04电脑的cuda驱动丢了&#xff0c;无奈需装PyTorch环境&#xff0c;只有CUDA11.0以上版本才支持Ubuntu20.04&#xff0c;所以安装了CUDA11.0、cuDNN8.0.5 为防止频繁在浏览器检索对应的贴子&#xff0c;今天记录一下。 一. 驱动安装 为防止驱动安装后没…

高德地图通过经纬度查找位置和轨迹回放

1、完整代码自己高德申请key,其他文章有写的 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title><…

C++常用的特性-->day05

友元的拓展语法 声明一个类为另外一个类的友元时&#xff0c;不再需要使用class关键字&#xff0c;并且还可以使用类的别名&#xff08;使用 typedef 或者 using 定义&#xff09;。 #include <iostream> using namespace std;// 类声明 class Tom; // 定义别名 using …

使用docker形式部署jumpserver

文章目录 前言一、背景二、使用步骤1.基础环境准备2.拉取镜像3.进行部署4.备份记录启动命令 前言 记录一下使用docker形式部署jumpserver服务的 一、背景 搭建一个jumpserver的堡垒机&#xff0c;但是发现之前是二进制文件部署的&#xff0c;会在物理机上部署污染环境&#x…

产品经理如何使用项目管理软件推进复杂项目按时上线

前言 相信很多产品同学或多或少都有过这样的经历&#xff1a;平时没有听到任何项目延期风险&#xff0c;但到了计划时间却迟迟无法提测……评审时没有任何argue&#xff0c;提测后发现开发的功能不是自己想要的……费劲九牛二虎之力终于让项目上线了&#xff0c;然而发现成果达…

贪心算法-汽车加油

这道题目描述了一个汽车旅行场景&#xff0c;需要设计一个有效的算法来决定在哪几个加油站停车加油&#xff0c;以便最小化加油次数。题目给出了汽车加满油后的行驶距离n公里&#xff0c;以及沿途若干个加油站的位置。我们需要找出一个方案&#xff0c;使得汽车能够完成整个旅程…

【大数据学习 | HBASE】hbase的读数据流程与hbase读取数据

1. hbase的读数据流程 在解析读取流程之前我们还需要知道两个功能性的组件和HFIle的格式信息 HFILE 存储在hdfs中的hbase文件&#xff0c;这个文件中会存在hbase中的数据以kv类型显示&#xff0c;同时还会存在hbase的元数据信息&#xff0c;包括整个hfile文件的索引大小&…

2024AAAI | DiffRAW: 利用扩散模型从手机RAW图生成单反相机质量的RGB图像

文章标题&#xff1a;《DiffRAW: Leveraging Diffusion Model to Generate DSLR-Comparable Perceptual Quality sRGB from Smartphone RAW Images》 原文链接&#xff1a;DiffRAW 本文是清华大学深圳研究院联合华为发表在AAAI-2024上的论文&#xff08;小声bb&#xff1a;华…

【Linux系统编程】第四十五弹---线程互斥:从问题到解决,深入探索互斥量的原理与实现

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、线程互斥 1.1、见一见多线程访问问题 1.2、解决多线程访问问题 1.2.1、互斥量的接口 1.2.2、互斥量接口的使用 1.2.3、…

【GVN】AWZ算法

AWZ算法的例子依旧来自于RKS的这篇文章《Detecting Equalities of Variables: Combining Efficiency with Precision》。 上面两个图&#xff0c;进行的是如下图所示的循环结构的等价类计算。 为什么得到的结果不是上图而是下图呢&#xff1f;这里其实是因为用到的AWZ的算法…

HBuilder使用虚拟机

按文档的连接一直不成功 没找到Simulator&#xff0c;原来是因为我电脑之前没安装过虚拟机版本 安装模拟器Simulator | uni-app官网 找到settings,左下角安装需要的对应版本的虚拟机就好了&#xff0c;然后重启hb

ubuntu下安装 git 及部署cosyvoice(2)

上一节已经可以了一部分。这一节&#xff0c;主要是让他动起来。 1.第一个错误 (cosyvoice) duyichengduyicheng-computer:~/gitee/CosyVoice$ python webui.py Traceback (most recent call last): File "webui.py", line 17, in <module> import grad…

16S,18S引物覆盖度测试:SILVA和PR2

16S 进入网站&#xff1a;https://www.arb-silva.de/search/testprime/ 填写引物和错配阈值 结果进入&#xff1a;Inspect Results inTaxonomy Browser 18S 进入网站&#xff1a;Primer database 进入&#xff1a;Test your primer set 可选择感兴趣的物种group&#xff0c;红…

【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…