1.引入"vector":
使用vector需包含头文件:vector
#include<vector>
2.基本概念:
- 动态数组:
vector
的大小可以动态改变,即可以在运行时增减元素。 - 自动内存管理:
vector
会自动管理存储空间,必要时扩展容量,而不需要手动分配或释放内存。 - 随机访问:支持通过下标进行随机访问,与普通数组类似
3.常用操作:
1.创建与初始化:
vector<int> vec1; // 创建一个空的vec1
vector<int> vec2(10); // 创建一个包含 10 个元素的vec2
vector<int> vec3(10, 1); // 创建一个包含 10 个元素且初始化为1的vec3
vector<int> vec4{1, 2, 3}; // 列表初始化:vec4初始化包含3个元素分别为 1,2,3
vector<int> vec5 = vec4; // 拷贝初始化:用vec4拷贝一个vec5
2.访问元素:
vec1[0] = 10; // 通过下标访问元素,不进行边界检查
int val = vec1.at(0); // 通过 at() 方法访问元素,进行边界检查
int first = vec1.front(); // 访问第一个元素
int last = vec1.back(); // 访问最后一个元素
3.添加和删除元素:
vec1.push_back(5); // 在末尾添加元素
vec1.pop_back(); // 移除最后一个元素
vec1.insert(vec1.begin(), 3); // 在开头插入元素
vec1.erase(vec1.begin()); // 移除开头的元素
vec1.clear(); // 清空 vector 中的所有元素
4.大小和容量:
size_t size = vec1.size(); // 返回当前元素个数
size_t capacity = vec1.capacity(); // 返回当前容量(即不需重新分配内存时可以容纳的元素个数)
vec1.reserve(100); // 预留空间,至少可以容纳 100 个元素
vec1.resize(50); // 改变 vector 的大小为 50
vec1.shrink_to_fit(); // 收缩容量以适应当前大小
bool empty = vec1.empty(); // 判断 vector 是否为空
5.赋值与交换:
vector<int> vec6 = vec4; // 拷贝赋值
vector<int> vec7(move(vec4)); // 移动赋值
vec1.swap(vec2); // 交换两个 vector 的内容
6.排序与算法:
sort(vec1.begin(), vec1.end()); // 排序
reverse(vec1.begin(), vec1.end()); // 反转
bool found = std::binary_search(vec1.begin(), vec1.end(), 3); // 二分查找
for_each(vec1.begin(), vec1.end(), [](int &n) { n++; }); // 对每个元素执行操作
4.特殊的成员函数:
“emplace_back()”
可以在容器的末尾直接构造元素,与 insert()
类似,但效率更高,避免不必要的拷贝或移动操作。
vec1.emplace_back(10, 20); // 直接构造一个对象放在末尾
vec1.emplace(vec1.begin(), 5); // 在开头插入元素 5
5.多维向量(二维数组):
vector<vector<int>> matrix(3, vector<int>(4, 0)); // 创建一个 3x4 的二维数组,初始化为 0
6.迭代器操作:
vector<int>::iterator it = vec1.begin(); // 获得指向第一个元素的迭代器
vector<int>::iterator end = vec1.end(); // 获得指向最后一个元素之后的迭代器
for (auto it = vec1.begin(); it != vec1.end(); ++it)
{
cout << *it << " ";
}
for (auto rit = vec1.rbegin(); rit != vec1.rend(); ++rit)
{ // 反向迭代器
cout << *rit << " ";
}
vector<int>::const_iterator cit = vec1.cbegin(); // 常量迭代器