vector
基本用法
- 头文件:
#include <vector>
- 初始化:
vector<int> ratings; //创建一个空的vector数组
vector<int> ratings(5); //(数目),默认初始化为0
vector<int> ratings(5, 2); //(数目,值)
vector<int> nums {ratings.begin(), ratings.begin()+5}; //用ratings前5个元素构造nums
- 插入与删除:
push_back
和pop_back
:
ratings.push_back(10); //末尾插入10
ratings.pop_back(); //删除末尾元素
erase
和insert
:
(1)插入操作:
- 新插入的元素放在
插入位置
之前
vector<int> nums1 {1, 2, 3, 4, 5};
vector<int> nums2 {6, 7, 8, 9, 10};
nums1.insert(nums1.end(), nums2.begin(), nums2.end()); //插入区间
//nums1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
nums1.insert(nums1.begin(), 10); //插入单个元素
//nums1 = {10, 1, 2, 3, 4, 5}
(2)删除操作
nums1.erase(nums.begin(), nums.begin() + 2); // [nums.begin(), nums.begin()+2)前开后闭区间
auto iter = nums.begin() + 1;
nums1.erase(iter); //删除单个元素
size
和capcity
:
size
表示vector中有多少个元素capacity
表示容量大小(多大内存)
vector<int> nums = { 1, 2, 3, 4, 5 };
cout << nums.size() << endl; //5
cout << nums.capacity() << endl; //5
nums.push_back(6);
cout << nums.size() << endl; //6
cout << nums.capacity() << endl; //7
- 遍历:
- 利用迭代器:
for(auto pd = scores.begin(); pd != scores.end(); pd++)
cout << *pd << endl;
- 基于范围的for循环:
for(int x : nums)
cout<<x<<endl;
基本原理
vector
动态增长的过程:重新分配内存空间
、拷贝原空间
、释放原空间
,动态增长的过程会降低vector
的效率
(1)空的vector
对象,size
和capacity
都为0
(2)空间不足时,新分配的空间大小为原空间的2倍,若2倍不够,则分配新的空间大小为需要的空间大小reserve(n)
预先分配一块大小为n
的内存,空间为满的情况下,不会引起重新分配内存空间,提升了效率- 若当前
vector
的capacity
大于resize
的参数大小时,resize
只会改变容器的数目,未改变容器的大小
vector
和list
的区别:
vector
是动态数组,拥有连续的存储空间,list
是双向链表,拥有的空间不连续- 随机存取:
vector
可以进行高效地随机存取,时间复杂度O(1),list
不提供随机访问,需要遍历,时间复杂度O(n)
- 插入删除:
vector
插入删除操作会造成内存的拷贝时间复杂度O(n)
,但在vector
尾部插入效率高,list
插入和删除效率高,时间复杂度O(1)
- 迭代器:
vector
的迭代器在使用之后可能会失效,而list
的迭代器在使用之后还可以继续使用- 额外开销: 由于
list
是双向链表,需要维护额外的指针来寻找下一个和前一个节点,因此开销大,而vector
无额外的开销
- 空间释放:
vector
占用的空间只曾不减,即使使用erase
或clear
删除或清空元素,内存仍然保存,所有内存空间是在vector
析构是才会被释放
array
基本用法
array<int, 10> m_arr{ 1, 2, 3, 4, 5, 6, 7, 8}; //未初始化的元素默认初始化为0(和C数组类似)
m_arr.size(); //10 表示容量大小
m_arr.front(); //1
m_arr.back(); //0
m_arr.data(); //数组所在的地址
基本原理
- vector和array有啥子区别?
- 首先vector和array比较相似,都是连续存储的,使用方法也基本一样都可以用中括号来访问元素,两者的唯一区别就在空间的运用的灵活性上:
(1)array是静态空间,定义的时候就要去指定出大小,而且不能改变,基本和C++内置的数组一样
(2)vector是动态的,不需要事先指定你要存储的元素的数据,当然你指定了也可以,但是无论你指定没指定,vector会自动扩容来容纳新的元素