C++ std::vector容器的用法(附带实例)
vector 容器实现的是动态数组,可以进行元素的插入和删除,并动态调整占用的内存空间。vector 容器提供了对数组元素的快速、随机访问,以及在序列尾部高效插入和删除元素的操作。
vector 容器以类模板 vector<T> 的形式定义在 <vector> 头文件中,并位于命名空间 std 中。因此,使用该容器前需引入 <vector> 头文件,并默认使用 std 命令空间,代码如下:
使用 vector 容器需要创建 vector 对象,创建方法有以下几种:
1) 创建一个空的 vector 对象,该对象可容纳 type 类型的数据,语法格式如下:
2) 创建一个大小为 size 的 vector 对象,语法格式如下:
3) 创建一个大小为 size 的 vector 对象,并将元素的值都初始化为 value,语法格式如下:
4) 使用复制构造函数,用已有的向量 myvector 创建一个新对象,语法格式如下:
5) 创建元素在指定范围内的向量,first 为起始位置,last 为结束位置,语法格式如下:
vector 容器的主要成员函数继承于随机接入容器和反向插入序列,具体如下表所示:
【实例 1】 vector 容器的使用。本实例创建两个 vector 容器并初始化,然后用不同方式插入、删除元素。具体代码如下:
vector 容器以类模板 vector<T> 的形式定义在 <vector> 头文件中,并位于命名空间 std 中。因此,使用该容器前需引入 <vector> 头文件,并默认使用 std 命令空间,代码如下:
#include <vector> using namespace std;
使用 vector 容器需要创建 vector 对象,创建方法有以下几种:
1) 创建一个空的 vector 对象,该对象可容纳 type 类型的数据,语法格式如下:
std::vector<type> name;
2) 创建一个大小为 size 的 vector 对象,语法格式如下:
std::vector<type> name(size);
3) 创建一个大小为 size 的 vector 对象,并将元素的值都初始化为 value,语法格式如下:
std::vector<type> name(size,value);
4) 使用复制构造函数,用已有的向量 myvector 创建一个新对象,语法格式如下:
std::vector<type> name(myvector);
5) 创建元素在指定范围内的向量,first 为起始位置,last 为结束位置,语法格式如下:
std::vector<type> name(first,last);
vector 容器的主要成员函数继承于随机接入容器和反向插入序列,具体如下表所示:
函数 | 说明 |
---|---|
begin() | 返回指向序列第一个元素的迭代器 |
end() | 返回指向序列最后一个元素的迭代器 |
rbegin() | 返回一个反向迭代器,指向序列最后一个元素 |
rend() | 返回一个反向迭代器,指向序列第一个元素 |
at(n) | 返回序列位置 n 处的元素 |
empty() | 判断序列是否为空,如果为空,则返回 true |
clear() | 删除序列中所有的元素 |
erase(i) | 删除迭代器 i 指向的元素 |
erase(start,end) | 删除迭代器 start 和 end 所辖范围内的元素 |
front() | 返回对序列第一个元素的引用 |
back() | 返回对序列最后一个元素的引用 |
insert(i,x) | 把 x 插入迭代器 i 指明的位置 |
insert(start,end) | 把迭代器 start 和 end 所辖范围内的元素插入迭代器 i 指明的位置 |
insert(i,n,x) | 把 x 的 n 个副本插入迭代器 i 指明的位置 |
assign(first,last) | 用迭代器 first 和 last 所辖范围内的元素替换 |
assign(num,val) | 用 val 的 num 个副本替换 |
size() | 返回序列的大小(即元素的个数) |
resize(n,x) | 重新设置序列大小为 n,新元素初始化为值 x |
capacity() | 返回序列的最大容量 |
max_size() | 返回 STL 允许的最大容量,通常是一个很大的数 |
pop_back() | 移除序列尾部的元素 |
push_back(x) | 在序列末尾添加一个元素 x |
reverse() | 翻转某一段元素 |
swap(vector) | 交换两个序列的元素 |
【实例 1】 vector 容器的使用。本实例创建两个 vector 容器并初始化,然后用不同方式插入、删除元素。具体代码如下:
#include <iostream> #include <vector> #include <cstring> using namespace std; int main() { vector<int> v1, v2; v1.resize(10); // 设置 v1, v2 大小为 10 v2.resize(10); v1 = vector<int>(8, 7); // 为 v1 的前 8 个元素赋值 7 int array[] = {1, 2, 3, 4, 5, 6, 7, 8}; v2 = vector<int>(array, array + 8); // 定义数组 array // 为 v2 赋值,使其等于 array cout << "v1 容量" << v1.capacity() << endl; cout << "v1 当前各项" << endl; for (decltype(v2.size()) i = 0; i<v1.size(); i++) { cout <<" "<< v1[i]; } cout << endl; cout << "v2 容量" << v2.capacity() << endl; cout << "v2 当前各项:" << endl; for (vector<int>::size_type i = 0; i<v1.size(); i++) { cout <<" "<< v2[i]; } cout << endl; v1.resize(0); // 设置 v1 的大小为 0 cout << "v1 的容量通过 resize 函数变成 0" << endl; if(v1.empty()) cout << "v1 容量" << v1.capacity() << endl; // 判断 v1 是否为空 else cout << "v1 是空的" << endl; cout << "将 v1 容量扩展为 8" << endl; v1.resize(8); // 设置 v1 的大小为 8 cout << "v1 当前各项:" << endl; for (decltype(v1.size()) i = 0; i<v1.size(); i++) { cout <<" "<< v1[i]; } cout << endl; v1.swap(v2); // 交换 v1, v2 两个向量的内容 cout << "v1 与 v2 swap 了" << endl; cout << "v1 当前各项:" << endl; cout << "v1 容量" << v1.capacity() << endl; for (decltype(v1.size()) i = 0; i<v1.size(); i++) { cout <<" "<< v1[i]; } cout << endl; v1.push_back(3); // 末尾增加一个元素 3 cout << "v1 后边加入了元素 3" << endl; cout << "v1 容量" << v1.capacity() << endl; for (decltype(v1.size()) i = 0; i<v1.size(); i++) { cout <<" "<< v1[i]; } cout << endl; v1.erase(v1.end() - 2); // 删除 v1 中倒数第 2 个元素 cout << "删除了倒数第二个元素" << endl; cout << "v1 容量" << v1.capacity() << endl; for (decltype(v1.size()) i = 0; i<v1.size(); i++) { cout <<" "<< v1[i]; } cout << endl; v1.pop_back(); // 删除 v1 最后一个元素 cout << "v1 通过栈操作 pop_back 放走了最后的元素" << endl; cout << "v1 当前各项:" << endl; cout << "v1 容量" << v1.capacity() << endl; for (vector<int>::size_type i = 0; i<v1.size(); i++) { cout <<" "<< v1[i]; } cout << endl; return 0; }程序运行结果为:
v1 容量8 v1 当前各项 7 7 7 7 7 7 7 7 v2 容量8 v2 当前各项: 1 2 3 4 5 6 7 8 v1 的容量通过 resize 函数变成 0 v1 容量8 将 v1 容量扩展为 8 v1 当前各项: 0 0 0 0 0 0 0 0 v1 与 v2 swap 了 v1 当前各项: v1 容量8 1 2 3 4 5 6 7 8 v1 后边加入了元素 3 v1 容量16 1 2 3 4 5 6 7 8 3 删除了倒数第二个元素 v1 容量16 1 2 3 4 5 6 7 3 v1 通过栈操作 pop_back 放走了最后的元素 v1 当前各项: v1 容量16 1 2 3 4 5 6 7本例的目的是向读者展示 vector 容器的操作方法。实际开发中,vector 容器插入元素的效率较低,一般不使用它进行插入。