在C++中,std::vector是一个动态数组容器,可以存储任意类型的元素,并且大小可以动态调整。vector包含着一系列连续存储的元素,其行为和数组类似。访问vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在vector中插入元素则是线性时间复杂度。以下是std::vector的一些常用用法和操作:
1. 包含头文件
在使用std::vector之前,需要包含头文件#include<vector>。
2. 声明和初始化
可以通过以下方式声明和初始化std::vector:
std::vector<int> vec; // 声明一个空的整数向量
std::vector<string> vec1; // 声明一个字符串型向量
std::vector<int> vec2(5); // 声明一个包含5个元素的整数向量,初始值为0
std::vector<int> vec3(5, 10); // 声明一个包含5个元素的整数向量,初始值为10
std::vector<int> vec4 = {1, 2, 3, 4}; // 使用初始化列表声明并初始化向量
3. 访问元素
可以通过下标访问std::vector中的元素,也可以使用迭代器来遍历:
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
for(int i = 0; i < vec.size(); i++) { // 通过下标访问
cout << vec[i] << " ";
}
cout << endl;
// 通过迭代器遍历访问
for(vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
cout << *it << " ";
}
return 0;
}
4. 添加和删除元素
可以使用push_back在向量的末尾添加元素,使用pop_back删除末尾元素,也可以使用insert和erase在指定位置插入和删除元素:
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6); // 向末尾添加元素6
for(int i = 0; i < vec.size(); i++) { // 1 2 3 4 5 6
cout << vec[i] << " ";
}
cout << endl;
vec.pop_back(); // 删除末尾的元素
for(vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) { // 1 2 3 4 5
cout << *it << " ";
}
cout << endl;
vec.insert(vec.begin() + 1, 10); // 在第2个位置插入元素10
for(int i = 0; i < vec.size(); i++) { // 1 10 2 3 4 5
cout << vec[i] << " ";
}
cout << endl;
vec.erase(vec.begin() + 2); // 删除第3个元素
for(int i = 0; i < vec.size(); i++) { // 1 10 3 4 5
cout << vec[i] << " ";
}
cout << endl;
return 0;
}
5. 其他常用操作
①size():返回向量中元素的个数
②empty():判断向量是否为空
③clear():清空向量中的所有元素
④resize():调整向量的大小
⑤swap():交换两个向量的内容
| 方法 | 语法 | 作用 |
| assign |
1. void assign(input_iterator start, input_iterator end); 2. void assign(size_type num, const TYPE &val); |
1. 将区间[start, end)的元素赋到当前vector 2. 赋num个值为val的元素到vector中 |
| at | TYPE at(size_type loc); | 返回当前vector指定位置loc的元素的引用,at()函数比[]运算符更加安全,因为它不会让你去访问到vector内越界的元素(见附) |
| back | TYPE back(); | 返回当前vector最末尾一个元素的引用 |
| begin | iterator begin(); | 返回一个指向当前vector起始元素的迭代器 |
| capacity | size_type capacity(); | 返回当前vector在重新进行内存分配以前所能够容纳的元素数量 |
| clear | void clear(); | 删除当前vector中的所有元素 |
| empty | bool empty(); | 如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false |
| end | iterator end(); |
返回一个指向当前vector末尾元素的下一位置的迭代器。 注意:如果要访问末尾元素,需要先将此迭代器自减1 |
| erase |
1. iterator erase(iterator loc); 2. iterator erase(iterator start, iterator end); |
1. 删除指定位置loc的元素 2. 删除区间[start, end)的所有元素。返回值是指向删除的最后一个元素的下一位置的迭代器 |
| front | TYPE front(); | 返回当前vector的内存分配器 |
| get_allocator | allocator_type get_allocator(); | 返回当前vector的内存分配器 |
| insert |
1. iterator insert(iterator loc, const TYPE &val); 2. void insert(iterator lov, size_type num, const TYPE &val); 3. void insert(iterator loc, input_iterator start, input_iterator end); |
1. 在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器 2. 在指定位置loc前插入num个值为val的元素 3. 在指定位置前插入区间[start, end)的所有元素 |
| max_size | size_type max_size(); | 返回当前vector能够容纳元素数量的最大值(包括可重新分配内存) |
| pop_back | void pop_back(); | 删除当前vector最末尾的一个元素 |
| push_back | void push_back(const TYPE &val); | 添加值为val的元素到当前vector末尾 |
| rbegin | reverse_iterator rbegin(); |
返回指向当前vector末尾的逆向迭代器 注:实际指向末尾的下一位置,而其内容为末尾元素的值 |
| rend | reverse_iterator rend(); | 返回指向当前vector起始位置的逆迭代器 |
| reserve | void reserve(size_type size); |
为当前vector预留至少共容纳size个元素的空间 注:实际空间可能大于size |
| resize | void resize(size_type size, TYPE val); | 改变当前vector的大小为size, 且对新创建的元素赋值为val |
| size | size_type size(); | 返回当前vector所容纳元素的数目 |
| swap | void swap(vector &from); | 交换当前vector与vector from 的元素 |
附:
1. at函数与"[]"运算符在访问元素时的差异
#include<iostream>
#include<vector>
using namespace std;
int main() {
vector<int> v(5, 1);
cout << "使用[]运算符:" << endl;
for(int i = 0; i < 10; i++) {
cout << v[i] << " ";
}
cout << endl;
cout << "使用at()函数:" << endl;
for(int i = 0; i < 10; i++) {
cout << v.at(i) << " ";
}
cout << endl;
return 0;
}

at()函数能够辨别出访问是否越界并在越界的时候抛出一个异常。
本文详细介绍了C++标准库中的std::vector容器,包括其声明、初始化、元素访问、添加和删除元素的方法,以及其它常用操作如大小调整和安全性特性。

389

被折叠的 条评论
为什么被折叠?



