首页 > 编程笔记 > C++笔记 阅读:29

C++ std::vector容器的用法(附带实例)

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 容器的主要成员函数继承于随机接入容器和反向插入序列,具体如下表所示:

表: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 容器插入元素的效率较低,一般不使用它进行插入。

相关文章