动态顺序表——vector
由于本人近期在准备竞赛,而在竞赛中写法会避免高耗时的算法,所以这篇博客不会带大家模拟实现动态顺序表,主要会介绍一些接口
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;
}
更多推荐


所有评论(0)