[C++初阶]vector的初步理解

一、标准库中的vector类

1.vector的介绍

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

2.vector的使用

记住,学stl一定一定要学会看文档,vector文档.vector在实际中非常的重要,在实际中我们熟悉常

见的接口就可以。

2.1 常用的构造函数

vector();

vector类的默认构造函数,构造一个没有元素的空容器

例如:

void test()
{
	vector<int> v;
}

需要引用头文件vector


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

构造一个vector类对象并用n个val初始化

例如:

void test()
{
	//vector<int> v;
	vector <int> v(5, 0);
	for (auto i : v)
	{
		cout << i << " ";
	}
}
int main()
{
	test();
	return 0;
}

运行结果:

void test()
{
	//vector<int> v;
	vector <int> v(5, 2);
	for (auto i : v)
	{
		cout << i << " ";
	}
}
int main()
{
	test();
	return 0;
}

运行结果:


拷贝构造函数

vector(const vector& x);

对于一个已有的vector容器进行拷贝,并生成一个新的容器

例如:

void test()
{
	//vector<int> v;
	vector <int> v1(5, 2);
	vector <int> v2(v1);
	for (auto i : v2)
	{
		cout << i << " ";
	}
}

运行结果:v


使用迭代器的初始化构造

Template<class InputIterator>

vector(InputIterator first, InputIterator last);

例如:

void test()
{
	//vector<int> v;
	vector <int> v1(5, 2);
	//vector <int> v2(v1);
	vector <int> v2(v1.begin(),v1.end()-1);
	for (auto i : v2)
	{
		cout << i << " ";
	}
}

运行结果v:

2.2 容量操作的接口

1.size
size_type size() const;

获取有效元素的个数

例如:

void test()
{
	//vector<int> v;
	vector <int> v1(5, 2);
	//vector <int> v2(v1);
	/*vector <int> v2(v1.begin(),v1.end()-1);*/
	//for (auto i : v2)
	//{
	//	cout << i << " ";
	//}
	cout << v1.size();
}
int main()
{
	test();
	return 0;
}

运行结果:

2.capacity

获取容量大小

size_type capacity() const;

例如:

void test()
{
	vector <int> v1(5, 2);
	cout << v1.capacity();
}

运行结果:

3.empty

判断容器是否为空

bool empty() const;

例如:

​
void test()
{
	vector <int> v1(5, 2);
	vector <int> v2;
	cout << v1.empty() << endl;
	cout << v2.empty() << endl;
}

​

运行结果:

4.resize
void resize (size_type n, value_type val = value_type());

将有效元素的个数修改为n,并且如果n大于原来的size,多出来的地方用val填充

如果没有给出val,就用0填充

例如:

void test()
{
	vector <int> v;
	cout << v.size() << endl;
	v.resize(20);
	cout << v.size() << endl;
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
	v.resize(30);
	cout << v.size() << endl;
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
	v.resize(10);
	cout << v.size() << endl;
	for (auto i : v)
	{
		cout << i << " ";
	}
}

运行结果:

5.max_size
size_type max_size() const;

返回最大大小

例如:

ps:这里push_back是尾插

void test1()
{
	vector <int> v;
	for (int i = 0; i < 100; i++) 
    v.push_back(i);
	cout << v.size() << endl;
}

运行结果:

6.reserve​​​​​
void reserve (size_type n);

改变容量大小

例如:

void test1()
{
	vector <int> v;
	cout << v.capacity() << endl;
	v.reserve(10);
	cout << v.capacity() << endl;
}

运行结果:

2.3vector的访问及其遍历

1.operator[]
reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

用下标直接访问

例如:

void test()
{
	vector <int> v(5,2);
	cout << v[2] << endl;
}

运行结果:

因此我们也可以通过下标去遍历,这里就不多作演示

2.迭代器

这里大体和string类差不多

iterator begin();

const_iterator begin() const;

iterator end();

const_iterator end() const;

迭代器,用于获取容器中第一个元素的位置和最后一个元素的下一个位置

例如:

​
void test()
{
	vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
}

​

运行结果:

3.反向迭代器

这个整体和迭代器差不多

reverse_iterator rbegin();

const_reverse_iterator rbegin() const;

reverse_iterator rend();

const_reverse_iterator rend() const;

rbegin获取容器中最后一个元素的位置,rend获取容器中的第一个元素的前一个位置

例如:

​
void test()
{
	vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };
	vector<int>::reverse_iterator rit = v.rbegin();
	while (rit != v.rend())
	{
		cout << *rit << " ";
		++rit;
	}
}

​

运行结果:

4.at
reference at (size_type n);
const_reference at (size_type n) const;

返回容器中位置n处的元素的引用

例如:

void test()
{
	vector <int> v = { 1,2,3,4,5,67,8,9,0,1 };
	cout << v.at(5) << endl;
	for (size_t i=0;i<v.size();++i)
	{
		cout << v.at(i) << " ";
	}
}

运行结果:

5.back
reference back();
const_reference back() const;

返回容器中最后一个元素的引用

例如:

void test()
{
	vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };
	cout << v.back()<< endl;
}

运行结果:

6.front
reference front();
const_reference front() const;

返回容器中第一个元素的引用

例如:

void test()
{
	vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };
	cout << v.front()<< endl;
}

运行结果:

2.4vector的增删查改

1.push_back();
void push_back(const value_type& val);

从容器尾部插入一个元素

例如:

void test()
{
	vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };
	cout << v.back()<< endl;
	v.push_back(99999);
	cout << v.back() << endl;
}

运行结果:

2.pop_back()
void test()
{
	vector <int> v = { 1,2,3,4,5,67,8,9,0,123 };
	cout << v.back()<< endl;
    v.pop_back();
	cout << v.back() << endl;
}

运行结果:

3.find()
template <class InputIterator, class T>

InputIterator find(InputIterator first, InputIterator last, const T& val);

在两个迭代器区间寻找val并返回其所在处的迭代器

例如:

void test2()
{
	vector<int> v = { 1,2,3,4,5,6 };
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
	vector<int>::iterator it = find(v.begin(), v.end(), 3);
	*it = 30;
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
}

需要注意的是,该函数并非vector的成员函数,是标准库中的函数,多个容器共用该find函数

4.insert()
iterator insert (iterator position, const value_type& val);
void insert (iterator position, size_type n, const value_type& val);

template <class InputIterator>    
void insert (iterator position, InputIterator first, InputIterator last);

在position位置插入元素

例如:

void test2()
{
	vector<int> v = { 1,2,3,4,5,6 };
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
	vector<int>::iterator it = find(v.begin(), v.end(), 3);
	v.insert(it, 99999);
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
}

运行结果:

5.earse()
iterator erase (iterator position);
iterator erase (iterator first, iterator last);

删除position位置的元素或者 [first,last) 区间的所有元素

例如:

void test2()
{
	vector<int> v = { 1,2,3,4,5,6 };
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
	vector<int>::iterator it = find(v.begin(), v.end(), 3);
	v.erase(it);
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
}

运行结果:

6.swap()
void swap (vector& x);

交换两个vector的数据空间

例如:

void test3()
{
	vector<int> v1 = { 1,2,3,4,5,6,7,8,9,0 };
	vector<int> v2 = { 0,9,8,7,6,5,4,3,2,1 };
	v1.swap(v2);
	for (auto i : v1)
	{
		cout << i << " ";
	}
	cout << endl;
}

运行结果:

7.assign()
template <class InputIterator>  void assign (InputIterator first, InputIterator last);
void assign (size_type n, const value_type& val);

为vector指定新内容,替换其当前内容并修改size

例如:

void test2()
{
	vector<int> v = { 1,2,3,4,5,6 };
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
	v.assign(5, 4);
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << endl;
}

运行结果:

8.clear()
void clear();

从vector中删除所有元素,不改变容量大小

例如:

void test2()
{
	vector<int> v = { 1,2,3,4,5,6 };
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << "size:" << v.size();
	cout << endl;
	v.clear();
	for (auto i : v)
	{
		cout << i << " ";
	}
	cout << "size:" << v.size();
	cout << endl;
}

运行结果:


本篇是对vector的初步理解,我们只需知道会用即可

如有错误,欢迎大家在评论区指出。

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

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

相关文章

海思SD3403/SS928V100开发(14)WIFI模块RTL8821驱动调试

1.前言 芯片平台: 海思SD3403/SS928V100 操作系统平台: Ubuntu20.04.05【自己移植】 WIFI模块: LB-LINK的RTL8821 2. 调试记录 参考供应商提供的操作手册 2.1 lsusb查看设备 2.2 编译供应商提供的驱动 2.2.1 修改Makefile 2.2.2 编译报错 解决办法: 将Makefile中arm…

FPGA基本资源介绍

文章目录 FPGA资源介绍1.可编程输入输出单元(IOB)2.可配置逻辑块(CLB)3.数字时钟管理模块(DCM)4.嵌入式块RAM(BLOCK RAM / BRAM)4.1其他ram 5.丰富的布线资源6.底层内嵌功能单元7.内嵌专用硬核软核、硬核、以及固核的概念 FPGA资源介绍 1.可编程输入输出单元(IOB) 可编程输入…

大语言模型融合知识图谱的问答系统研究

文章目录 题目摘要方法实验消融实验 题目 大语言模型融合知识图谱的问答系统研究 论文地址&#xff1a;http://fcst.ceaj.org/CN/10.3778/j.issn.1673-9418.2308070 项目地址&#xff1a;https://github.com/zhangheyi-1/llmkgqas-tcm/ 摘要 问答系统&#xff08;Question Ans…

数据库管理-第217期 Oracle的高可用-02(20240704)

数据库管理217期 2024-07-04 数据库管理-第217期 Oracle的高可用-02&#xff08;20240704&#xff09;1 GDS简介2 GDS架构2.1 全局数据服务池2.2 全局数据服务域2.3 全局服务管理2.4 全局数据服务目录2.5 Oracle通知服务 3 GDS简图3.1 负载均衡3.2 只读服务失败转移3.3 多主复制…

1014-33SF 同轴连接器

型号简介 1014-33SF是Southwest Microwave的2.92 mm 同轴连接器。这款连接器采用钢制外壳&#xff0c;铍铜触点&#xff0c;并经过金镀处理&#xff0c;以确保良好的导电性和耐腐蚀性。适用于高频微波应用&#xff0c;例如测试设备、通信系统等。 型号特点 频率范围&#xff1…

openEuler 社区 2024 年 5 月运作报告

概述 2024年5月&#xff0c;在 OpenAtom openEuler(简称&#xff1a;“openEuler”&#xff09;技术委员会例会上&#xff0c;经技术委员会委员审定&#xff0c;同意开发者在社区成立 SBOM SIG、Intelligence SIG。SBOM SIG 主要围绕 SBOM 构建openEuler社区软件供应链安全&…

【React】Ant Design -- Table分页功能实现

实现步骤 为Table组件指定pagination属性来展示分页效果在分页切换事件中获取到筛选表单中选中的数据使用当前页数据修改params参数依赖引起接口重新调用获取最新数据 const pageChange (page) > {// 拿到当前页参数 修改params 引起接口更新setParams({...params,page})…

Finding and exploting an unused API endpoint

Using 0$ account buy a piece of lether priced at $133 1、尝试访问api接口 大概率可能访问不到,但是可以尝试访问下 /api/swagger/v1 /openapi.json 2、页面功能点寻找 api send to Repeter 3、Find Supported HTTP请求 POST方法测试 通过测试得知支持GET方法和PATC…

[产品]理解产品

课程安排 认识互联网行业 1.行业对比 2.互联网公司 广义理解: 互联网行业的公司大都以计算机网络技术为基础, 利用网络平台帮助企业提供服务, 并以此获取收入 3.行业细分 典型产品 认识产品经理 1.职责差异 不同类型的公司, 产品经理岗位所负责的工作都是略有差异的 1,外包…

Docker Desktop 简易操作指南 (Windows, macOS, Linux)

1. 下载最新版本 Docker Desktop https://www.docker.com/products/docker-desktop/ 2.启动 Docker Desktop 3.常用命令&#xff08;在 cmd 或 Terminal 中执行&#xff09; #列出所有镜像&#xff08;Images&#xff09; docker images #列出所有容器&#xff08;Containers&…

后端之路——阿里云OSS云存储

一、何为阿里云OSS 全名叫“阿里云对象存储OSS”&#xff0c;就是云存储&#xff0c;前端发文件到服务器&#xff0c;服务器不用再存到本地磁盘&#xff0c;可以直接传给“阿里云OSS”&#xff0c;存在网上。 二、怎么用 大体逻辑&#xff1a; 细分的话就是&#xff1a; 1、准…

visual studio 2022配置和使用protobuf

上图证明&#xff0c;我真的测了好多遍&#xff0c;测了好多版本的protobuf&#xff0c;花了很多时间。不过好在最后在vs2022上测通了。 下载protobuf 这里是protobuf下载的地址。 Releases protocolbuffers/protobuf GitHub 个人使用的3.21.9这个版本才跑通的。 1、首先…

Lesson 48 Do you like ... ? Do you want ... ?

Lesson 48 Do you like … ? Do you want … ? 词汇 fresh a. 新鲜的【食物】 搭配&#xff1a;fresh water 淡水    fresh man 新生    fresh air 新鲜空气    fresh egg 新鲜鸡蛋 例句&#xff1a;我们喜欢新鲜的空气。    We like fresh egg. egg n. 蛋【通…

unity知识点 专项四 一文彻底说清楚(锚点(anchor)、中心点(pivot)、位置(position)之间的关系)

一 概述 想要使UI控件在屏幕中达到正确的显示效果&#xff0c;比如自适应屏幕尺寸、固定边距等等&#xff0c;首先要理清楚几个基本概念和设置&#xff1a;锚点(anchor)、中心点(pivot)、位置(position)、UI缩放模式、父物件的transform设置 二 Anchor、Pivot与Position 2…

Qualcomm QCA206x EasyMesh For Ubuntu

1. 引言 关于EasyMesh概念我们这里就不再过多的赘述&#xff0c;此篇文档的目的是&#xff0c;让广大初学者&#xff0c;有一个很方便的平台进行EasyMesh的学习和测试。 2. X86 Ubuntu平台 2.1 硬件环境准备 备注&#xff1a;QCA206x WiFi module推荐使用移远的FC64E/FC66E。…

代码随想录算法训练营第74天:路径总结[1]

代码随想录算法训练营第74天&#xff1a;路径总结 ‍ A * 算法精讲 &#xff08;A star算法&#xff09; 卡码网&#xff1a;126. 骑士的攻击(opens new window) 题目描述 在象棋中&#xff0c;马和象的移动规则分别是“马走日”和“象走田”。现给定骑士的起始坐标和目标…

细说MCU的ADC模块单通道连续采样的实现方法

目录 一、工程依赖的硬件及背景 二、设计目的 三、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、配置ADC 4、配置系统时钟和ADC时钟 5、配置TIM3 6、配置串口 四、代码修改 1、重定义TIM3中断回调函数 2、启动ADC及重写其回调函数 3、定义用于存储转换结果的数…

【深度学习练习】心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 一、什么是RNN RNN与传统神经网络最大的区别在于&#xff0c;每次都会将前一次的输出结果&#xff0c;带到下一隐藏层中一起训练。如下图所示&#xff1a; …

macOS版ChatGPT更新:修复AI对话纯文本存储问题

猫头虎 &#x1f42f; 建联猫头虎&#xff0c;商务合作&#xff0c;产品评测&#xff0c;产品推广&#xff0c;个人自媒体创作&#xff0c;超级个体&#xff0c;涨粉秘籍&#xff0c;一起探索编程世界的无限可能&#xff01; macOS版ChatGPT更新&#xff1a;修复AI对话纯文本…

C++ 空间和时间高效的二项式系数(Space and time efficient Binomial Coefficient)

这里函数采用两个参数n和k&#xff0c;并返回二项式系数 C(n, k) 的值。 例子&#xff1a; 输入&#xff1a; n 4 和 k 2 输出&#xff1a; 6 解释&#xff1a; 4 C 2 等于 4!/(2!*2!) 6 输入&#xff1a; n 5 和 k 2 输出&#xff1a; 10 解释&#xff1a; 5 C …