【C++养成计划】动态数组 —— 快速上手 STL vector 类(Day14)


前言:

在程序设计过程中,如果我们知道数组的长度,可以定义静态数组。实际上,我们会经常遇到数组长度在一开始并不能确定的情况,那么这个时候就需要考虑用动态数组了,这样不仅节省了存储的内存,还使得程序更加灵活可靠。

如果你想进一步了解数组的数据结构特点,可以戳戳:白话数据结构——数组&数组的基本操作


一、vector的特点

vector是个模板类,提供了动态数组的通用功能,特点如下:

(1)在数组末尾添加(删除)元素所需的时间是固定的。
(2)在数组中间添加(删除)元素所需的时间与该元素后面的元素个数成正比
(3)存储的元素是动态的,而vector类负责管理内存。

二、实例化vector

下面给出了五种初始化(实例化)的方法:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	//1.初始化一个动态数组dyarr1
	vector <int> dyarr1;
	//2.初始化一个动态数组dyarr2,数组的初始长度是10
	vector <int> dyarr2(10);
	//3.初始化一个动态数组dyarr3,包含10个元素,每个元素都是1
	vector <int> dyarr3(10,1);
	//4.将动态数组dyarr3复制到dyarr4
	vector <int> dyarr4(dyarr3);
	//5.使用迭代器,将dyarr4中的前5个元素复制到dyarr5
	vector <int> dyarr5(dyarr4.begin(),dyarr4.begin()+5);
	for(int i=0;i<dyarr5.size();i++)
		cout<<dyarr3[i]<<endl;
	return 0;
}

注意:vector <类型> dyarr ;这里的类型不仅是int,也可以是float、类、vector等。

三、常用的操作函数

3.1 在末尾插入元素push_back()

//在数组dyarr1后添加一个元素50
dyarr1.push_back(50)

3.2 在指定位置插入元素insert()

push_back可以在末尾插入元素。如果要在中间插入元素,可以使用insert()

下面举例三种插入方法:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector <int> dyarr1(5,10);
	//1.在数组dyarr1前插入20
	dyarr1.insert(dyarr1.begin(),20);
	//2.在数组dyarr1末尾插入两个30
	dyarr1.insert(dyarr1.end(),2,30);
	//3.将数组dyarr2插入到dyarr1第一个元素的后面(后面的元素依次后移)
	vector <int> dyarr2(2,50);
	dyarr1.insert(dyarr1.begin()+1,dyarr2.begin(),dyarr2.end());
	//显示dyarr1的每一个元素
	for(int i=0;i<dyarr1.size();i++)
		cout<<dyarr1[i]<<" ";
}

3.3 删除末尾元素pop_back()

pop_back将元素从vector末尾删除所需的时间是固定的,不随存储元素的个数而变。

//删除dyarr1最后一个元素
dyarr1.pop_back();

3.4 访问vector元素的三种方法

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector <int> dyarr1(5,10); //初始化数组5个元素都是10 
	//1.用下标运算符[]以数组方式访问
	for(int i=0;i<dyarr1.size();i++)
		cout<<dyarr1[i]<<" "; 
	cout<<endl;
	//2.用成员函数at()访问
	for(int i=0;i<dyarr1.size();i++)
		cout<<dyarr1.at(i)<<" ";
	cout<<endl;
	//3.使用迭代器意义访问打印出来(类似于指针)
	vector <int>::iterator Locator=dyarr1.begin();
	while(Locator!=dyarr1.end())
	{
		cout<<*Locator<<" ";
		++Locator;
	} 
	return 0;
}

3.5 理解size和capacity

size就是vector的大小,指的是数组实际存储的元素数。而capacity是vector的容量,指的是能够存储元素的最大容量。因此,vector的size小于或等于capacity。

(1) 要查询vector当前存储的元素数,可调用size():

cout<<"size:"<<dyarr1.size()<<endl;

(2) 要查询vector的容量,可调用capacity():

cout<<"capacity:"<<dyarr1.capacity()<<endl;

四、动态数组deque类

deque类与vector类非常类似,但是支持在数组的开头末尾插入或删除元素。
使用前需要包含头文件:

#include <deque>

(1) 使用push_back和pop_back在末尾插入和删除元素

deque <int> dyarr1(5,10); //初始化数组5个元素都是10 
dyarr1.push_back(100);
dyarr1.pop_back();

(2) 使用push_front和pop_front在开头插入和删除元素

dyarr1.push_front(100);//在数组开头插入100
dyarr1.pop_front();//删除数组开头的元素

五、总结

(1)当不知道需要存储多少个元素时,务必使用动态数组vector或deque
(2)vector只能在末尾进行插入或删除,deque在开头和末尾都可以进行插入和删除操作。

猜你喜欢

转载自blog.csdn.net/wjinjie/article/details/108381370