STL之vector(不定长数组)

时间:2021-09-25 08:13:02

vector就是一个不定长数组,另外它把一些常用操作“封装”在了vector类型内部。例如,若a是一个vector,可以用a.size()读取它的大小,a.resize()改变大小,a.push_back()向尾部添加元素,a.pop_back()删除最后一个元素,clear()清空,empty测试是否为空。

vector是一个模板类,所以需要用vector<int> a或者vector<double> b这样的方式来声明一个vector。vector<int>是一个类似于 int a[]的整数数组,而vector<string>就是一个类似于string a[]的字符串数组,vector可以直接赋值,也可作为函数的参数或返回值,而无需像传递数组那样另外用一个变量指定元素个数。

一. vector用法:

1.头文件:#include<vector>

2. vector声明及初始化

vector<int>::iterator it;//定义一个迭代器

vector<int> vec; //声明一个int型向量
vector<string>v2;// vector元素为string型
vector<node>v3;//入队元素为结构体型,结构体可以自行定义
vector<);     //声明一个初始大小为5的int向量
vector<, ); //声明一个初始大小为10且值都是1的向量
vector<int> vec(tmp);   //声明并用tmp向量初始化vec向量
vector<);  //用向量vec的第0个到第2个值初始化tmp
] = {, , , , };
vector<);      //将arr数组的元素用于初始化vec向量
//说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素,
//这个主要是为了和vec.end()指针统一。
vector<], &arr[]); //将arr[1]~arr[4]范围内的元素作为vec的初始值

3. vector基本操作

v1.push_back()   //在数组的最后添加一个数据
v1.pop_back()    //去掉数组的最后一个数据
v1.front()     //返回第一个元素(栈顶元素)
v1.begin()           //得到数组头的指针,用迭代器接受
v1.end()             //得到数组的最后一个单元+1的指针,用迭代器接受
v1.clear()        // 移除容器中所有数据
v1.empty()         //判断容器是否为空
v1.erase(pos)        //删除pos位置的数据
v1.erase(beg,end)// 删除[beg,end)区间的数据
v1.size()         //回容器中实际数据的个数
v1.insert(pos,data) //在pos处插入数据

举例:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    vector <int> v;                            //定义vector
    vector<int>::iterator it;                 //定义一个vector迭代器
    ; i >= ; i--)              //插入数据
        v.push_back(i);
    cout<<"输出:";
    for(it=v.begin();it!=v.end();it++)       //输出迭代器的值
        cout<<*it<<" ";
    cout<<endl;
    it-=;
    cout<<"最后一个的值为:"<<*it<<"     "<<endl;
    v.erase(it);                             //删除最后一个元素
    cout <<"元素个数:" <<v.size() << endl;    //输出元素个数
    sort(v.begin(), v.end());                    //vector排序
    cout<<"排序后:";
    for(it=v.begin();it!=v.end();it++)            //输出vector元素
        cout << *it << " ";
    cout<<endl;
    v.insert(v.begin(),) ;                 //在pos位置插入一个elem
    cout<<"第一个元素为:" <<v.front()<<endl;//输出第一个元素
    v.pop_back();                         //去掉最后一个元素
    cout << "元素个数:" <<v.size() << endl;//输出元素个数
    v.clear();                                //vector清空
    cout <<"清空后元素个数:" << v.size() << endl;    //输出元素个数
    ;
}

https://blog.csdn.net/weixin_35929051/article/details/52661619

(1). 容量

  • 向量大小: vec.size();
  • 向量最大容量: vec.max_size();
  • 更改向量大小: vec.resize();
  • 向量真实大小: vec.capacity();
  • 向量判空: vec.empty();
  • 减少向量大小到满足元素所占存储空间的大小: vec.shrink_to_fit();

(2). 修改

  • 多个元素赋值: vec.assign(); //类似于初始化时用数组进行赋值
  • 末尾添加元素: vec.push_back();
  • 末尾删除元素: vec.pop_back();
  • 任意位置插入元素: vec.insert();
  •   //ve.insert(it,n,e)//在it指向元素的前面添加n个元素e
  • ve.insert(ve.end(),1,2);//相当于在尾部添加1个2
  • ve.insert(ve.begin(),1,0);//在头部添加1个0
  • 任意位置删除元素: vec.erase();
  • 交换两个向量的元素: vec.swap();
  • 清空向量元素: vec.clear();

(3)迭代器

  • 开始指针:vec.begin();
  • 末尾指针:vec.end(); //指向最后一个元素的下一个位置
  • 指向常量的开始指针: vec.cbegin(); //意思就是不能通过这个指针来修改所指的内容,但还是可以通过其他方式修改的,而且指针也是可以移动的。
  • 指向常量的末尾指针: vec.cend();

(4)元素的访问

  • 下标访问: vec[1]; //并不会检查是否越界
  • at方法访问: vec.at(1); //以上两者的区别就是at会检查是否越界,是则抛出out of range异常
  • 访问第一个元素: vec.front();
  • 访问最后一个元素: vec.back();
  • 返回一个指针: int* p = vec.data(); //可行的原因在于vector在内存中就是一个连续存储的数组,所以可以返回一个指针指向这个数组。这是是C++11的特性。

(4)算法

  • 遍历元素
vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
    cout << *it << endl;
//或者
for (size_t i = 0; i < vec.size(); i++) {
    cout << vec.at(i) << endl;
}
  • 元素翻转
#include <algorithm>
reverse(vec.begin(), vec.end());
  • 元素排序
#include <algorithm>
sort(vec.begin(), vec.end()); //采用的是从小到大的排序
//如果想从大到小排序,可以采用上面反转函数,也可以采用下面方法:
bool Comp(const int& a, const int& b) {
    return a > b;
}
sort(vec.begin(), vec.end(), Comp);

二.重要应用--vector二维使用 

例如 :

vector<];   //第一维的大小是固定的,不超过maxn---30,但第二维的大小是不固定的
int t,n;
cin>>n;
;i<n;i++)  //插入值
{
cin>>t;
a[i].push_back(t);
}
//c++vector二维数组常用写法

vector<vector<);//定义行数为3列数不定的二维数组
a.size();//返回二维数组的行数
a[].size();//返回二维数组第一行的列数
vector<string>v2;// vector元素为string型