由于本人近期在准备竞赛,而在竞赛中写法会避免高耗时的算法,所以这篇博客不会带大家模拟实现动态顺序表,主要会介绍一些接口

1. 创建 vector

如果你问我什么是 vector, 我会告诉你它是 C++ 的  STL 中已经封装好的容器,但是即使你已经学习过 vector ,你也不太明白其中的意思,所以我希望带大家先熟悉它的用法,大家可以慢慢体会这句话的含义

vector 的创建方式有很多种 ,大家可以不用一次性全部记住,可以多写一些代码, 看别人写的代码慢慢熟悉

#include<vector>   //大家要记得使用 vector 的时候要包含这个头文件
const int N = 10;
int main()
{
	//基本格式 vector<数据类型> name(num, 初始值) 
	vector<int> a1;   //创建一个 vector 数组
	vector<int> a2(N); //创建一个大小为 N 的 vector 数组
	vector<int> a3(N, 1); //创建一个大小为 N 初始值为 1 的 vector 数组
	vector<int> a4 = {1,2,3,4,5};
	
	vector<string> a7;
	vector<node> a8;    //创建一个以结构体为类型的 vector 数组 
	
	vector<vector<int>> a5; //相当于创建一个二维数组,并且其中的每一个都可以变长
	vector<int> a6[N]; //创建 N 个 vector 数组 
	return 0;
 } 

这里我重点介绍一下 vector<vector<int>> a5, a5 就像一个柜子,而柜子里又有若干个格子,而 vector<vector<int>> a5(10)就像是创建了十个柜子,但是每个柜子里都只有一个格子,所以它所占的空间为 10 * 4 (int 所占字节数) = 40 个字节数

但是 vector 数组的特点就是它可以变长,并且可以只改变我想改变的柜子,传统的二维数组是每个都有一样的大小,而 vector 就可以只改变想改变的位置

因为具体的操作方式涉及到 resize 这个接口,所以在文章的后面在做演示

2. size / empty

1. size: 返回元素个数

2. empty : bool 类型的返回值,若数组为空,则返回 true, 反之返回 false

#include<iostream>
#include<vector>
using namespace std;
int main() 
{
	vector<int> a(10);
	vector<int> b = {1,2,3,4,5};
	cout << a.size() << endl; //输出 10
	 
	if(b.empty())
		cout << "空" << endl;
	else
	cout << "非空" << endl;
	//输出 非空 
	return 0;
}

3.push_back 和 pop_back

push_back:在尾部插入一个元素

pop_back:  在尾部删除一个元素

int main()
{
	vector<int> a(5);
	a.push_back(2);
	a.push_back(3);
	a.push_back(4);
	for(int i = 0; i < a.size(); i++)
	{
		cout << a[i] << ' ';
	}
	cout << endl;
	//输出 0 0 0 0 0 2 3 4
	 
	a.pop_back(); 
	for(int i = 0; i < a.size(); i++)
	{
		cout << a[i] << ' ';
	}
	cout << endl;
	//输出0 0 0 0 0 2 3 
	return 0;
 } 

4. front / back

1. front :返回⾸元素;

2. back :返回尾元素;

// 5. 首元素和尾元素
void test_fb()
{
	vector<int> a(5);
	for(int i = 0; i < 5; i++)
	{
		a[i] = i + 1;
	} 
	cout << a.front() << " " << a.back() << endl;
}

5.resize

1.修改 vector 的⼤⼩

2.如果⼤于原始的⼤⼩,多出来的位置会补上默认值,⼀般是 0 

3.如果⼩于原始的⼤⼩,相当于把后⾯的元素全部删掉

// 如果不加引⽤,会拷⻉⼀份,时间开销很⼤
void print(vector<int>& a)
{
    for(auto x : a)
    {
    cout << x << " ";
    } 
    cout << endl;
} 

// 6. resize
void test_resize()
{
    vector<int> a(5, 1);
    a.resize(10); // 扩⼤
    print(a);
    a.resize(3); // 缩⼩
    print(a);
}

 现在让我们在来看修改数据类型为 vector<int> 的 vector 数组

int main() 
{
	int vector<vector<int>> a(10);
	a[1].resize(10); //使 a[1] 扩容为能存储 10 个数据的数组
	 
	return 0;
}

可以看到由 vector 创建的 vector<int>类型的数组会比二维数组灵活很多,因为它可以单独选择某一个区域扩大

6. clear

不知道你看到这个接口的名称,有没有猜出来它是什么意思?它的意思就是清空当前的数组里的所有元素,这里的清空所指的意思不仅仅是把每一个元素置为0,而是把它所申请的空间全部回收

int main() 
{
	vector<int> a(5, 1);
	cout << a.size() << endl; //输出 5 
	a.clear();
	cout << a.size() << endl; //输出 0 
	return 0;
}

                 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐