zoukankan      html  css  js  c++  java
  • vector 基本用法详解

    vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。 vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似, 不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了; 而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。

    vector的扩充机制:按照容器现在容量的一倍进行增长。 vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加, 而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。 这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新

    vector是一个定义于namespace std内的template:

    namespace std

    {

    template<class T,

      class Allocator = allocator<T>>

    class vector;

    }

    vector的元素是可以任意类型的T,但必须具备赋值和拷贝两个性质。

    第二个template参数,用来定义内存模型。

    特点:

      在末端添加和删除元素,vector性能很好,但是在前端中端很差,因为当前操作点之后的每一个元素都必须移到另一个位置,每一次都会调用赋值操作。

    注意:

      一旦内存重新分配,和vector元素有关的所有引用、指针、迭代器、都会失效,并且重新分配内存很耗时间。

     可以使用v.reserve()保留适当容量,避免重新分配内存

    #include <iostream>
    #include <vector> //必须包含头文件
    using namespace std;
    
    int main()
    {
        //几种vector声明
        vector<int>v1;        //定义空的vector
        vector<int>v2(10);    //产生大小为10的vector
        vector<int>v3(10,-1);    //产生大小为10,并且每个元素都是-1的vector
        vector<int>v4(v3);        //用一个vector产生一个vecotr
        
        int arr[5]={1,2,3,4,5};
        vector<int>v5(arr,&arr[5]);    //以区间[beg;end)做为初值的vector
    
        cout<<"当前元素数量"<<v5.size()<<endl;
        cout<<"v1大小是否为0:"<< (v1.empty()?"":"不空")<<endl;
        cout<<"v2大小是否为0:"<< (v2.empty()?"":"不空")<<endl;
        cout<<"v1可容纳的元素最大数量:"<<v1.max_size()<<endl;    //电脑内存4GB
        cout<<"v2可容纳的元素最大数量:"<<v2.max_size()<<endl;
        cout<<"v2重新分配前所能容纳的元素最大数:"<<v2.capacity()<<endl;
        v2.reserve(20); //给v2重新分配20个空间
        cout<<"v2.reserve(20)后重新分配前所能容纳的元素最大数:"<<v2.capacity()<<endl;
        cout<<"v3 v4是否相等:"<<(v3==v4 ? "相等":"不等")<<endl;
    
    
        v1.push_back(11);//在尾部添加一个元素1
        v1.push_back(22);
        v1.push_back(33);
    
        //迭代器是随机存取迭代器,对vector来说就是指针,迭代器持续有效
        //除非在一个较小索引位置插入删除元素或者内存重新分配
        vector<int>::iterator ita; //声明一个迭代器
        int i=0;
        for(ita=v1.begin(), i=0;ita != v1.end();i++,ita++)//v1.begin()指向v1的第一个元素,v1.end()指向最后元素的下一位置
        {
            cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
        }
        v1.pop_back();//在尾部删除一个元素
        for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
        {
            cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
        }
    
        //跟v1.begin()和v1.end()对应的有v1.rbegin()和v1.rend(),
        //v1.begin()指向逆向的第一个元素,v1.end()指向逆向最后元素的下一位置,使用    vector<int>::reverse_iterator ita;
    
        v2=v1; //将v1的元素全部拷到v2
        for(ita=v2.begin(),i=0;ita != v2.end();i++,ita++)
        {
            cout<<"v2中的"<<i<<"值:"<<v2[i]<<endl;
        }
        //v2.clear();
        v2.assign(3,44);    
        for(ita=v2.begin(),i=0;ita != v2.end();i++,ita++)
        {
            cout<<"v2中的"<<i<<"值:"<<v2[i]<<endl;
        }
        v2.assign(arr,&arr[5]);    
        for(ita=v2.begin(),i=0;ita != v2.end();i++,ita++)
        {
            cout<<"v2中的"<<i<<"值:"<<v2[i]<<endl;
        }
    
        v1.swap(v2);
        //swap(v1,v2);
        cout<<"v1第2个元素"<<v1.at(1)<<endl;    //越界抛出异常
        //cout<<"v1第6个元素"<<v1[5]<<endl;  //越界,不检查
        cout<<"v1首个元素"<<v1.front()<<endl;
        cout<<"v1最后元素"<<v1.back()<<endl;
    
        vector<int>::iterator pos=v1.begin();
        v1.insert(pos,11);
        //v1.insert(pos,4,55); //如果直接用就是错的,因为迭代器失效了
        //v1.insert(pos,arr,&arr[5]);
        for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
        {
            cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
        }
        cout<<endl;
        pos=v1.begin(); //因为直接用迭代器失效,所以重新声明下
        v1.erase(++pos); //删除制定位置
        for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
        {
            cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
        }
        cout<<endl;
        pos=v1.begin(); 
        v1.erase(pos,pos+3);
        for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
        {
            cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
        }
        cout<<endl;
    
        //v1.resize(5); //将元素数量改成5,如果v1变大,则多的按默认走
        v1.resize(5,9); //将元素数量改成5,如果v1变大,则多的赋值成9
        for(ita=v1.begin(),i=0;ita != v1.end();i++,ita++)
        {
            cout<<"v1中的"<<i<<"值:"<<v1[i]<<endl;
        }
        cout<<endl;
    
        v1.clear(); //清空
    
    
        system("pause");
        return 0;
    }

     个人网站http://www.ravedonut.com/

  • 相关阅读:
    element ui 表单清空
    element ui 覆盖样式 方法
    element ui 修改表单值 提交无效
    element ui 抽屉里的表单输入框无法修改值
    element ui 抽屉首次显示 闪烁
    css 左侧高度 跟随右侧内容高度 自适应
    PICNUF框架
    elementui 抽屉组件标题 出现黑色边框
    vue 子组件跨多层调用父组件中方法
    vue 编辑table 数据 未点击提交,table里的数据就发生了改变(深拷贝处理)
  • 原文地址:https://www.cnblogs.com/panjiangfy/p/vector.html
Copyright © 2011-2022 走看看