C++ 学习笔记---容器---vector(后续会更新)
概念
可自动扩容的动态数组,不需要手动管理内存,可以根据元素数量自动扩容‘’
- 连续内存存储
- 随机访问速度快
- STL 生态完整
- 缓存友好
定义
定义空vector
vector<数据类型> 名;定义空vector,并指定长度
vector<数据类型> 名(长度);定义vector,并指定长度,且所有初识值都为0
vector<数据类型> 名(长度,值);定义vector,并指定元素
vector<数据类型> 名={值1,值2};
访问元素
不越界检查访问元素 [ ]
名[下标];越界检查访问元素 at
名.at(下标);访问队首元素
名.front();访问队尾元素
名.back();得到最大值
*max_element(名.begin(), 名.end());得到最小值
*min_element(名.begin(), 名.end());
获取大小
名.size(); 名.capacity();区别:capacity 通常大于等于 size。capacity会提前申请更多空间,避免重复扩容
- size:当前元素数量。
- capacity:当前已分配的内存容量。
遍历
下标法
for (int i = 0; i < 名.size(); i++) { cout << 名[i] << " "; }迭代器法
//正向迭代 for (auto it = 名.begin(); it != 名.end(); ++it) { cout << *it << " "; } //反向迭代 for (auto it = 名.rbegin(); it != 名.rend(); ++it) { cout << *it << " "; }备注:
1.迭代器是编程中用于遍历集合元素的一种工具。它可以记住当前遍历的位置,并通过特定方法逐步访问集合中的元素。迭代器的核心特性是只能向前遍历,不能后退。
范围for循环
for(int element : 名){ cout<<element<<" "; }
添加元素 push_back()
队尾添加
名.push_back(元素);指定位置添加
在下标n位置添加数值m
名.insert(名.begin()+n,m);在下标m处添加n个数a
名.insert(名.begin()+m,n,a);
删除元素
队尾删除
名.pop_back()删除下标n的元素
名.erase(名.begin()+n)
- 名.begin() 表示从vector的最开头
- n表示从开头往下移动几位
删除从下标从m到n-1的所有元素
名.erase(名.begin()+m,名.begin()+n);遵循前包后不包原则
清空vector
名.clear()
| 特性 | 数组 | vector |
| 大小固定 | 是 | 否 |
| 自动扩容 | 否 | 是 |
| 连续内存 | 是 | 是 |
| 随机访问 | 快 | 快 |
| STL支持 | 较少 | 完整 |
| 安全访问 | 无 | at() |
题目练习
#include <bits/stdc++.h> using namespace std; int main(){ vector<int> v; int num; for(int i=0;i<9;i++){ cin>>num; v.push_back(num); } cout<<"遍历输出"<<endl; for(int e:v){ cout<<e<<" "; } cout<<endl; cout<<"删除队首,删除队尾,后输出"<<endl; v.erase(v.begin()); v.pop_back(); for(int e:v){ cout<<e<<" "; } cout<<endl; cout<<"删除下标2,后输出"<<endl; v.erase(v.begin()+2); for(int e:v){ cout<<e<<" "; } cout<<endl; cout<<"在下标5位置插入数字999,后输出"<<endl; v.insert(v.begin()+5,999); for(int e:v){ cout<<e<<" "; } cout<<endl; cout<<"删除下标2-4(包括4),后输出"<<endl; v.erase(v.begin()+2,v.begin()+5); for(int e:v){ cout<<e<<" "; } cout<<endl; cout<<"在下标1处添加2个888,后输出"<<endl; v.insert(v.begin()+1,2,888); for(int e:v){ cout<<e<<" "; } cout<<endl; cout<<"输出数组内的个数和空间 "<<endl; cout<<v.size()<<" "<<v.capacity(); return 0; }
