标准库容器vector
表示对象的集合,可存放任意类型的数据,但类型必须相同。
使用需要包含头文件#include <vector>
原理
vector是一个动态增长的数组,里面有一个指针指向一片连续的内存空间在增加元素时,如果超过自身最大的容量,vector则将自身的容量扩充为原来的两倍。扩充空间需要经过的步骤:自动申请一片更大的空间(空间配置器),将全部元素移动到新的空间,释放旧的内存空间,因此扩充空间的开销较大。一旦vector空间重新配置,则指向原来vector的所有迭代器都失效了,因为vector的地址改变了。
vector数组的初始化:
vector< T > vec 空vector,默认初始化
vector< T> vec1= { 1,2,3,4,5,6,7,8,9,10,11,12 }
vector< T> vec2{ 1,2,3,4,5,6,7,8,9,10,11,12 }
vector< T > vec3( n, value) n个值为value的重复元素
vector< int > month { 12 }
像这样的声明会有歧义,究竟是0位置有一个元素12还是大小是12,C++11后给了初始化列表优先权,所以这里是只有一个值为12的元素,要想声明一个大小为12的vector需要使用圆括号: vector< int > month( 12 )
vector可使用范围for语句来遍历,可使用auto让编译器自动推导类型
int sum = 0;
for(auto x : num )
sum += x;
特别注意
- 建议多使用c++容器来代替c风格的数组, 避免内存泄露等错误
- 遍历时建议使用基于范围的for循环
for (auto& val: arr){ val.xxx }
- 还可使用迭代器来指定使用某个容器内的元素:
//vector<T> v
for (auto i = v.begin(); i != v.end(); ++i) { //begin(),end()返回迭代器,auto简化代码
cout << *i << " ";//*i指迭代器指向的对象,可操作他来改变容器内该对象的值或属性
}
- vector对象(以及string对象)的下标运算符可用于访问已存在的元素,不能用于在指定位置添加元素。