神奇的动态数组——vector

神奇的 Vector 动态数组

什么是 Vector

​ Vector 是一个动态数组(dynamic array),提供了很多操作的接口,使用 Vector 需要引入头文件 #include 并且一定要声明命名空间 std,因为 Vector 是定义在 std 里 template 中的

​ Vector 是一种动态的顺序表结构,可以像数组一样访问、随机访问、只用迭代器访问其中的元素

Vector 的属性

大小和容量

​ 对于常规数组来说,最大的限制就是其大小必须事先定义好,而 Vector 中通过 size() 和 capacity() 分别来表示其大小和容量,其中 size() 用来表示大小,即 Vector 中当前存放了多少数据;capacity() 用来表示容量,即 Vector 中最大存放的数据是多少,而当 size() 将要超过 capacity() 时,Vector 会自动扩充其容量,这就是 Vector 是动态数组的原因

1
2
3
4
5
vector<int> a;//定义 int 类型的 Vector
for (int i = 0; i < 50; i++) {
a.push_back(i);//在 Vector 尾部添加元素
cout << "a = " << a[i] << " size = " << a.size() << " capacity = " << a.capacity() << endl;
}

​ 以上代码可以很好的反应 capacity() 可以自行扩大的特性

定义

1
2
3
4
5
vector<DataType> item;//定义 Vector
vector<DataType> item(n);//初始化 Vector 的容量
vector<DataType> item(int, DataType);//初始化 Vector 的容量并且使其内容全部为 Datatype
vector<DataType> item(it.begin(), it.end());//传进一个迭代器区间用来为 Vector 赋值
vector<DataType> item(Class);//传进一个对象,执行其构造函数

​ Vector 动态数组里可以存放任何类型的变量,但前提是一个 Vector 只能存放同一种类型的数据,并且 Vector 中有很多定义方法,可以根据需求使用不同的方法来定义你的 Vector

一些方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vector<int> item;
item.empty();//布尔型函数,空返回 true,非空返回 false
item.size();//返回当前 Vector 的元素数量
item.max_size();//返回当前 Vector 可容纳的最大元素数量
item.capacity();//返回当前 Vector 的容量
item.reserve(n);//重新设定当前 Vector 的容量,若新值小于当前值,则语句无效
item.shrink_to_fit();//修改当前 Vector 的容量为其 size() 值
item.assign(n, data);//将n个数据 data 添加进 Vector 中
item.assign(begin(), end());//复制迭代器中 begin 到 end 的内容并赋值给 Vector
item.swap(Vector);
swap(item, Vector);//以上两个方法都是用来交换两个 Vector 中的元素的
item.push_back(data);//在 Vector 末尾插入新元素 data
item.pop_back();//移除 Vector 的最后一个元素
item.insert(pos, data);//在 pos 的位置插入 data,并返回这个 data 的 pos(int 类型)
item.insert(pos, n, data);//在 pos 的位置上插入 n 个 data,并返回第一个 data 的位置
item.insert(pos, begin(), end());//在 pos 的位置上,添加一段迭代器返回的值

迭代器!

​ 迭代器用来访问 Vector 中的数据元素,这也是 Vector 特有的功能,使用迭代器可以实现一种十分简便的遍历方法

1
2
3
4
std::vector<int>::iterator it1 = item.begin();
//指向首个元素的迭代器
std::vector<char>::iterator it1 = item.begin();
std::vector<string>::iterator it1 = item.end();

​ 迭代器可以正反迭代

1
2
for (auto it = a.cbegin(); it != a.cend(); it++)
cout << *it << " ";

​ auto 在 C++ 11 中的作用是自动推断变量类型,但是必须在定义时就初始化该变量,类似于 const

总结

​ Vector 的本质就是一个动态数组,因为基本操作上是一个有序容器,所以也可以当作栈或者表来使用

-------------本文结束感谢您的阅读-------------