IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++ vector函数接口及其底层原理 -> 正文阅读

[C++知识库]C++ vector函数接口及其底层原理

什么是vector

vector类我们可以将其看作是一个能够动态扩容的数组。
在vs下其扩容一般每次是按照前一次容量的1.5倍进行扩容。如:4,6
9…string类支持的功能,在vector下基本都能使用。

无参构造函数

格式:vector<存储数据类型> 容器名字

vector<int> v1;//(1)

?? ( 1 ) (1) (1)存储int类型数据,容器名字为v1vector

有参构造函数

?? ( 1 ) (1) (1)普通版本
格式:vector<存储的数据类型>容器名字(n,a)
vector的前n个位置会被初始化成a

vector<int> v1(10,5);

?? ( 2 ) (2) (2)迭代器版本
格式:vector<存储的数据类型>容器名字(迭代器1,迭代器2)
vector会依次被初始化成迭代器1到迭代器2这个区间存储的数据。

vector<int> v3(4, 5);
vector<int> v2(v3.begin(), v3.end());//(1)

?? ( 1 ) (1) (1)使用v3的迭代器初始化v2

拷贝构造函数

vector支持使用一个容器去拷贝另一个容器。

	vector<int> v1(4, 5);
	vector<int> v2(v1);//(1)

?? ( 1 ) (1) (1)使用v1容器去拷贝v2

迭代器

vector同样支持迭代器进行遍历访问。迭代器在stl中的用法基本一致。
?? ( 1 ) (1) (1)正向迭代器
begin迭代器:指向vector存储的第一个元素。
end迭代器:指向vector最后一个元素的下一个位置。
在这里插入图片描述

	vector<int> v3;
	v3.push_back(1);
	v3.push_back(2);
	v3.push_back(3);
	vector<int>::iterator it = v3.begin();
	while (it!=v3.end())
	{
		cout << *it << endl;
		it++;
	}

?? ( 2 ) (2) (2)反向迭代器
rbegin迭代器:指向vector存储的最后一个元素。
end迭代器:指向vector第一个元素的上一个位置。
在这里插入图片描述

vector<int> v3;
	v3.push_back(1);
	v3.push_back(2);
	v3.push_back(3);
	vector<int> ::reverse_iterator  it= v3.rbegin();//(1)
	while (it != v3.rend())
	{
		cout << *it << endl;
		it++;
	}

?? ( 1 ) (1) (1)反向迭代器的名词是revese_iterator。起始迭代器为rbegin(),末尾迭代器为rend()

push_back

string一样,vectorpush_back也是尾插一个数据。
格式:容器名字.push_back(插入的数据)

vector<int> v1;
v1.push_back(4);

pop_back

将容器最后一个位置的数据弹出(类似栈的出栈一样)
格式:容器名字.pop_back()

vector<int> v1;
v1.push_back(10);
v1.pop_back();

常用函数接口

在这里插入图片描述

[]

vector支持随机访问容器内的某个位置,用法也很简单。
格式:容器名字[访问的位置]

	vector<int> v1(10,5);
	cout<<v1[2]<<endl;

ps:vector存储数据也是从0开始
?? ( 1 ) (1) (1)访问v1的第三个数据。

reserve

作用:扩容
在这里插入图片描述
注意:这里的n是可以存储数据的个数,而不是字节数。并且reserve不会对扩容以后的空间进行初始化。

vector<int> v1;
	v1.reserve(100);//(1)

?? ( 1 ) (1) (1)在经过扩容以后,v1容器的容量会变成100。

resize

作用:扩容
在这里插入图片描述
resize和用法和reserve基本一致。
只不过resize对于扩容的数据会进行初始化。也就是参数二
举例说明:v1容器当前存储了5个1,这时扩容到20,剩下的15个空间就会被初始化成参数二的值。

	vector<int> v1;
	v1.resize(100,5);

ps::resizereserve扩充的容量小于当前容量的时候都不会使得容量变小。

vector的底层原理

vector类中包含了三个T类型的指针,分别是
-start:指向空间的起始部分
_finish:指向当前已用空间的末尾
_endofstorger:指向申请空间的末尾
在这里插入图片描述

insert

在这里插入图片描述
参数一:插入的位置(迭代器的位置)
参数二:要插入的数据

	vector<int> v3;
	v3.insert(v3.begin(), 100);

erase

?? ( 1 ) (1) (1)删除单个数据
在这里插入图片描述
参数:删除迭代器位置的数据

vector<int> v1(10,6);
v1.erase(v1.begin());

?? ( 2 ) (2) (2)删除某个区间的数据
在这里插入图片描述
参数一:开始删除的位置。
参数二:删除结束的下一个位置。

vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);

	v1.erase(v1.begin(), --v1.end());

vector常搭配使用的algorithm

?? ( 1 ) (1) (1)find查找
在这里插入图片描述
参数一:开始查找的位置
参数二:查找结束位置的下一个位置
参数三:要查找的值
ps::如果没找到,会返回末尾迭代器。

vector<int> v1;
vector<int>::iterator it=find(v1.begin(),v1.end(),10);
if(it!=v1.end())
cout<<*it<<endl;

?? ( 2 ) (2) (2)sort排序
sort的底层是通过快排qsort进行实现的,时间复杂度为nlongn
在这里插入图片描述
参数一:排序开始的位置
参数二:排序结束位置的下一个位置

vector<int> v1;
v1.push_back(10);
v1.push_back(5);
v1.push_back(4);
sort(v1.begin(),v1.end());

?? ( 3 ) (3) (3)reverse逆序
reverse用于将某个迭代器区间的元素进行逆序。
在这里插入图片描述
参数一:开始的位置
参数二:结束位置的下一个位置

vector<int> v1;
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);
	v1.push_back(4);

	reverse(v1.begin(), v1.end());

二维vector和二维数组的区别

在C语言中,如果想要申请一块二维数组的空间,需要使用malloc函数,这时候就需要申请一个指针数组,并且还需要为指针数组里的每一个元素申请一段空间。
假设需要申请一块4行4列的空间。

int **p=(int**p)malloc(sizeof(int*)*4)

从代码上就能看出非常的麻烦。
在这里插入图片描述
使用vector创建二维数组就非常爽了,假设需要创建一个四行四列的数组。

vector<vector<int>>res;
res.resize(4);
for(int i=0;i<4;i++)
res[i].resize(4);

在这里插入图片描述
并且在访问的时候二维数组和二维vector的访问方式也是不同。
二维数组p,在访问元素时可以通过[]进行访问,如p[i][j],其在访问ij列的数据的时候是通过解引用两次的方式。
而二维vector通过[]进行访问的时候,如res[i][j],是通过[]返回一个对象,再通过这个对象继续访问。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-02 13:24:33  更:2022-05-02 13:24:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 23:37:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码