vector容器知识点

vector容器:动态数组,单口容器;

动态增长基本原理:当插入新元素的时候,如果空间不足,那么vector会重新申请更大的内存空间,将原空间数据拷贝到新空间,释放旧空间数据,再把新元素插入新申请空间。

v.begin() 返回迭代器,指向第一个元素
v.end()   指向最后一个元素的下一个位置
v.rbegin()指向最后一个元素
v.rend()  指向第一个元素的前一个位置
上面返回值都是指针
v.front() 返回第一个元素的值
v.back()  返回最后一个元素的值
构造vector
vector<int> v1(arr, arr + sizeof(arr)/sizeof(int)); 把arr[]数组赋值给v1;

vector<int> v2(v1.begin(), v1.end());  复制v1的[begin,end)区间给v2;

vector<int> v3(v2); 将v2赋值给v3;

v.size(); 返回容器元素个数;
v.empty();判断容器是否为空,若为空返回true;

遍历(只介绍常用的两种,还有别的方式)
一、可以采用访问数组元素的类似方式访问vector内部的元素
eg:
    for(int i=0; i<v.size(); i++)
		cout << v[i];

二、与数组元素的指针访问方式类似,采用迭代器
eg:
    vector<int>::iterator it = v.begin();
    for(it; it != v.end(); it++)
        cout << (*it);

assign函数
void assign(const_iterator first,const_iterator last); 开始和结束的指针;
eg: 
    v.assign(v1.begin(), v1.end()); 将v1的[begin,end)区间赋值给v;

void assign(size_type n,const T& x = T());
eg:
    v.assign(3, 1); 将3个1赋值给v;

一些插入操作
void push_back(const T& x); 尾部插入;
eg:
    v.push_back(10); //在尾部插入10;

eg:
    vector<int> v;
    v.push_back(10); v内元素为10
    v.insert(v.begin(), 30); 在begin的位置前插入,插入后v为30、10;
    v.insert(v.end(), 40);  在end的位置前插入,注:end为最后一个元素的下一位,
                            所以插入后v为30、10、40;
    
    v.insert(v.begin(), 3, 2); 在迭代器指向位置插入3个2;
                               插入后v内元素为2、2、2、30、10、40;
    v.insert(v.begin() + 2, 40);
        插入第二位置,vector支持随机访问;
        迭代器可以直接+2、+3,-2....;
        注:在指定位置插入元素会引起数据元素移动,效率低;
    
    
重载'='
eg:
    vector<int> v;
    vector<int> v1;
    v1.push_back(3); v1此时元素有3;
    v.push_back(1);
    v1 = v;         v1此时元素为1;

删除操作
v.pop_back(); 删除尾部元素;
v.erase(v.begin()); 删除迭代器指向元素;
v.erase(v.begin(), v.end()); 删除区间;
eg:
    假如v内元素为1、2、3、4、5;
    v.erase(v.begin()+1, v.begin()+4);
    删除后v内元素为1、5;
v.clear(); 删除容器内所有元素;

v.capacity(); 返回容器容量;
    可以在定义的时候指定eg:vector<int> v(80); 此时v.capacity()为80;
    注:v.size() <= v.capacity();
    size是实际个数,capacity是最大容量;
    就像数组中 int a[10]; 10是capacity,实际存的个数为size小于等于capacity;


v.resize(num, elem);
    重新指定容器容量为num;
    若变长,如果没有第二个参数elem,则以默认值(0)填充新位置,否则以elem填充新位置;
    若变短,超出部分元素被删除;
    注:若容器指定容量,如果num超过最大容量会引起内存自动分配

v.reserve(len);
    容器预留len个元素长度;
    预留位置不初始化,元素不可访问;

reserve和resize区别:
   reserve只修改capacity大小,不修改size大小,只有一个参数表示预留容量大小;
   resize既修改capacity大小, 也修改size大小,有两个参数,一个是大小,一个是填充值,默认值为0;

v.swap(v1); v和v1交换,交换了指向的首尾指针和容量指针;

vector中swap做内存收缩:
vector添加元素会自动增长,但是删除元素时不会自动减少
eg:
    for(int i=0; i<10000; i++)
        v.push_back(i);
    此时v.size()=10000, v.capacity()=16384(未指定容量大小时取决于电脑,我的电脑显示16384);
    v.resize(10);
    此时v.size()=10, v.capacity()=16384;
    vector<int>(v).swap(v);
    v会根据v内实际元素个数初始化自己,然后进行交换,即vector<int>内存空间指针和v指针的指向发生交换,
    初始化完成后,vector<int>内存空间被释放;

vector用sort排序
sort需引入头文件#include <algorithm>
方法:sort(v.begin(), v.end()); //默认从小到大
若vector存入的是结构体或想以其他方式排列可自定义函数cmp
     sort(v.begin(), v.end(), cmp);
    

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值