zoukankan      html  css  js  c++  java
  • [总结]C++ 之 向量vector


    目录

    常用函数:

    一.声明,初始化

    二.访问

    1.和数组相似

     2.使用迭代器

    注意:

    ★补充:

    补充:

    三.二维向量

    四.内存管理使用


    常用函数:

    front():返回当前vector容器中 起始元素的引用。
    back():返回当前vector容器中末尾元素的引用。
    begin():返回一个当前vector容器中起始元素的迭代器。
    end():返回一个当前vector容器中末尾元素的迭代器。

    empy():  判断向量是否为空,若是返回1,否则返回

    size():  获取向量中的元素个数

    clear() //清空向量中的元素

    insert : 插入

    ①、 a.insert(a.begin(), 1000); //将1000插入到向量a的起始位置前
    
    ②、 a.insert(a.begin(), 3, 1000) ; //将三个1000插到向量起始位置前
    
    ③、 vector<int> a(5, 1) ;
    
        vector<int> b(10) ;
    
        b.insert(b.begin(), a.begin(), a.end()) ; 
        //将a.begin()~ a.end()之间的全部元素插入到b.begin()前
    b.swap(a): a向量与b向量进行交换  想清空vector一定要定义一个空的vector通过swap去释放空间,而不是简单的clear,clear仅仅是清空数据并不会释放vector空间。
    //本质是交换了指向的首尾指针和容量指针
    
      void swap(vector<_Tp, _Alloc>& __x) {
        __STD::swap(_M_start, __x._M_start);
        __STD::swap(_M_finish, __x._M_finish);
        __STD::swap(_M_end_of_storage, __x._M_end_of_storage);
      }

    参考:vector 释放内存 swap

    一.声明,初始化

    数组是静态分配空间,分配后不可改变

    vector是动态分配内存,随着元素的不断插入,按照自身的一套机制不断扩充自身的容量, vector容器的容量增长是按照容器现在容量的一倍进行增长。 先复制2倍的vector空间,再删除原来1倍的vector空间。空间复杂度增大

    	1.vector<int> a ;                                //声明一个int型向量a
        2.vector<int> a(5) ;                            //声明一个初始大小为5的向量
        3.vector<int> a(10, 1) ;                         //声明一个初始大小为10且初始值都为1的向量
        4.vector<int> b(a) ;                             //声明并用向量a初始化向量b
        5.vector<int> b(a.begin(), a.begin()+5) ;        //将a向量中从第0个到第4个(共5个)作为向量b的初始值

    也可使用数组初始化向量

      int a[] = {1, 2, 3, 4, 5} ;
      6.vector<int> v(n, n+5) ;              //将数组n的前5个元素作为向量a的初值
      7.vector<int> v(&n[0], &n[4]) ;        //将n[0] - n[4]范围内(不包含n[4])的元素作为向量a的初值

    <7>示例:

        int a[]={1,2,3,9,5,6,7,8};
        vector<int> v1(&a[0],&a[3]);
        for(auto t:v1){
            cout<<t<<" ";
        }

    二.访问

    1.和数组相似

        vector<int> a(10, 0) ;      //大小为10初值为0的向量a
    
        //部分元素进行输入,输出
        cin >> a[2] ;
        cin >> a[5] ;
        cout << a[2]
    
        //全部输出
        int i ;
        for(i=0; i<a.size(); i++)
            cout<<a[i]<<" " ;

     2.使用迭代器

    可以使用遍历器(又称迭代器)进行输出控制,
    (a.begin(), a.end())分别表示起始元素和最后一个元素之外的元素位置。

    注意:

    end()返回的却是末尾元素再下一个元素的迭代器(取最后一个元素的话用last()),好处是

    1.判断是否到尾部简单只要!=end就行了,"<"运算在STL中是要避免的,因为计算量可能会比较大。 

    2.判断空区间较为简单begin()==end()。

        //全部输出
        vector<int>::iterator t ;
        for(t = a.begin(); t != a.end(); t++)
            cout << *t << " " ;//访问指针,对实例a的修改可能会使迭代失效

    endl; }

    补充:

    auto推导的类型如同

    template <class T>

    void f(const T&); 中T的类型一样

    三.二维向量

     创建的是一个"元素为向量"的向量。同样可以根据一维向量的相关特性对二维向量进行操作。

        //10行,5列,全部初始化为1
        vector< vector<int> > b(10, vector<int>(5, 1)) ;
    
        //部分输入输出
        //cin>>b[1][1] ;
        //cin>>b[2][3] ;
        //cout<<b[1][1]
    
        //全部输出
        int m, n ;
        for(int m=0; m<b.size(); m++)           //b.size()获取行向量的大小
        {
            for(int n=0; n<b[m].size(); n++)    //获取向量中具体每个向量的大小
            {
                cout<<b[m][n]<<" " <<endl;
            }
            cout<<endl;
        }

    四.内存管理使用

    参考:C++ vector内存管理使用解析-你真的学会vector了吗?

    天涯犹在,不诉薄凉。
  • 相关阅读:
    【bzoj1878】[SDOI2009]HH的项链
    【bzoj2821】作诗(Poetize)
    【bzoj2120】数颜色
    PAT 乙级真题 1005.德才论
    PAT 乙级真题 1004.福尔摩斯的约会
    博客园使用悬挂猫(上吊猫)置顶插件
    PAT 乙级真题 1002.数字分类
    AcWing 789.数的范围
    AcWing 788.逆序对的数量
    二分查找
  • 原文地址:https://www.cnblogs.com/Knight02/p/15014743.html
Copyright © 2011-2022 走看看