C++ STL——vector

Vector 使用帮助:

(一)常用函数:包含#include<vector>

  1. push_back    在数组的最后添加一个数据
  2. pop_back     去掉数组的最后一个数据 
  3. at                  得到编号位置的数据
  4. begin            得到数组头的指针
  5. end               得到数组的最后一个单元+1的指针
  6. front              得到数组头的引用
  7. back              得到数组的最后一个单元的引用
  8. max_size       得到vector最大可以是多大
  9. capacity        当前vector分配的大小
  10. size               当前使用数据的大小
  11. resize            改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
  12. reserve          改变当前vecotr所分配空间的大小
  13. erase             删除指针指向的数据项
  14. clear              清空当前的vector
  15. rbegin            将vector反转后的开始指针返回(其实就是原来的end-1)
  16. rend              将vector反转构的结束指针返回(其实就是原来的begin-1)
  17. empty            判断vector是否为空
  18. swap             与另一个vector交换数据
  19. vec.insert(vec.begin()+i,a);         在第i+1个元素前面插入a;

(二)常用算法: 包含#include<algorithm>

(1) reverse(vec.begin(),vec.end());            //将元素翻转

(2) sort(vec.begin(),vec.end());                 //排序  (默认是按升序排列,即从小到大).

可以通过重写排序比较函数按照降序比较,如下:

bool Comp(const int &a,const int &b)       //定义排序比较函数
{
    return a>b;
}
调用时:sort(vec.begin(),vec.end(),Comp),这样就降序排序。

 

(三)常用函数代码实现:

#include <iostream>  
#include <vector>  
using namespace std;  
  
int main(void)  
{  
    int n = 5, i = 1;

    vector<int> vec;        //未指定初始化方式,因此采用默认方式初始化vec,即长度为0的空容器;
    vector<int> vec2(vec);  //定义对象v2,作为v1的副本;
    vector<int> vec3 = vec; //定义对象v3,作为v1的副本;
    vector<int> vec4(n, i); //定义对象v4,它包含n个数值为i的元素;
    vector<int> vec5(n);    //定义对象v5,v5中包含n个元素,每个元素的值均是0;

    //推入5个值进向量
    for(i = 0; i < 5; ++i)
    {
       vec.push_back(i);
    } 
  
    //向量的大小
    cout << vec.size() << endl;  
  
    // 数组下标方式遍历vector  
    for (i = 0; i < vec.size(); ++i)
    {
       cout << vec[i] << " "; 
    }  
    cout << endl;     
  
    //迭代器方式遍历vector
    vector<int>::iterator itor = vec.begin();  
    for (; itor != vec.end(); ++itor)
    {
        cout << *itor << " "; 
    }  
    cout << endl; 
    
    //迭代器方式遍历const vector (注意:如果向量是常向量,那么迭代器在定义时也需要定义为常量)
    const vector<int> vec6(5, 1);
    vector<int>::const_iterator itor2 = vec6.begin();  
    for (; itor2 != vec6.end(); ++itor2)  
    {
        cout << *itor2 << " "; 
    }
    cout << endl;     

  
    //***************   常用函数    ******************//

    vec.push_back(10);           //在向量尾部插入10
    vec.pop_back();              //删除向量尾部的数据

    cout << vec.empty() << endl; //输出0,vec不为空
    cout << vec.front() << endl; //输出0,返回第1个元素的数据
    cout << vec.back() << endl;  //输出4,返回最后1个元素的数据
    cout << vec.at(3) << endl;  //输出第4个元素的值
 
    vec.insert(vec.begin() + 1, 10); //在第2个元素前插入10
    vec.insert(vec.begin(), 2, 11);  //在第1个元素前插入2个11

    vec.clear();                     //清空后,size = 0

    //erase() 使用迭代器,清空vector
    vector<int>::iterator itor11 = vec.begin();  
    while(itor11 != vec.end())
    {
        itor11 = vec.erase(itor11);
    }

    return 0;  

(四)vector 文字补充说明:

  1. vector 向量是一种顺序行容器。相当于数组,但是其大小可以不预先指定,并且自动扩展。他可以像数组一样通过使用[]符号被操作。因此可以将vector变量看做动态数组。
  2. vector 的分配方式:在创建vector变量后,它会自动在内存中分配一块连续的内存空间来保存数据,初始内存空间大小可以预先指定,也可以由vector默认指定大小。当存储的数据超过分配的空间时,vector会重新分配一块内存,但是这样的分配很耗时,在重新分配空间时它的步骤如下:

         (1)vector 会申请一块更大的内存块;

         (2)将原来的数据拷贝到新的内存块中;

         (3)销毁掉原内存块中的对象(调用对象的析构函数);

         (4)将原来的内存空间释放掉。

     3. vector 的注意事项:当vector保存的数据量很大时,如果此时进行插入数据导致需要更大的空间来保存这些数据量,那么将会大大的影响程序运行的效率,所以我们应该合理地使用vector。

 

(五)vector的特点:

(1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组一样通过[]符号被操作。也可以进行动态操作,通常体现在push_back() pop_back();

(2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at();

(3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是vector 大多情况下并不是满存的,在未存储的区域实际是浪费的;

(4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现是按照顺序表的原理;

(5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop ;

(6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创建vector 时就指定其空间大小。

 

注:文章为综合总结,只为给自己提供编程时可用的工具书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值