美文网首页
STL容器之vector

STL容器之vector

作者: 二进制人类 | 来源:发表于2022-10-10 19:00 被阅读0次

    单端动态数组

    遍历输出

    void printVectorInt(vector<int> &v)
    {
        vector<int>::iterator it=v.begin();
        for(;it!=v.end();it++)
        {
            //*it==容器中的元素
            cout<<*it<<" ";
        }
        cout<<endl;
    }
    

    构造函数

    vector<T> v; //采用模板实现类实现,默认构造函数
    vector(v.begin(), v.end());//将 v[begin(), end())区间中的元素拷贝给本身。
    vector(n, elem);//构造函数将 n 个 elem 拷贝给本身。
    vector(const vector &vec);//拷贝构造函数
    

    实例

    #include <iostream>
    #include <vector>
    using namespace std;
    
    void test(){
        vector<int> v1(5,100);
        cout<<"size="<<v1.size()<<",容量="<<v1.capacity()<<endl;
        //size=5,容量=5
        //100 100 100 100 100
    }
    

    自动扩容机制

    void test(){
        vector<int> v1;
        vector<int>::iterator it;
        int i=0;
        int count=0;
        for(i=0;i<1000;i++){
            v1.push_back(i);
            if(it != v1.begin()){
                count++;
                it=v1.begin();
                cout<<"第"<<count<<"次开辟了空间 容量为:"<<v1.capacity()<<endl;
            }
        }
    }
    /*
    第1次开辟了空间 容量为:1
    第2次开辟了空间 容量为:2
    第3次开辟了空间 容量为:4
    第4次开辟了空间 容量为:8
    第5次开辟了空间 容量为:16
    第6次开辟了空间 容量为:32
    第7次开辟了空间 容量为:64
    第8次开辟了空间 容量为:128
    第9次开辟了空间 容量为:256
    第10次开辟了空间 容量为:512
    第11次开辟了空间 容量为:1024
    */
    

    赋值操作

    assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
    assign(n, elem);//将 n 个 elem 拷贝赋值给本身。
    vector& operator=(const vector &vec);//重载等号操作符
    swap(vec);// 将 vec 与本身的元素互换
    
    void test(){
        vector<int> v1;
        v1.push_back(10);
        v1.push_back(20);
        v1.push_back(30);
        v1.push_back(40);
        v1.push_back(50);
        printVectorInt(v1);//10 20 30 40 50
    
        vector<int> v2;
        v2.assign(v1.begin()+1,v1.end()-1);
        printVectorInt(v2);//20 30 40
    
        vector<int> v3;
        v3=v2;
        printVectorInt(v3);//20 30 40
    
        vector<int> v4(5,100);
        printVectorInt(v3);//20 30 40
        printVectorInt(v4);//100 100 100 100 100
        v3.swap(v4);
        printVectorInt(v3);//100 100 100 100 100
        printVectorInt(v4);//20 30 40
    }
    

    容量操作

    size();//返回容器中元素的个数
    empty();//判断容器是否为空
    resize(int num);//重新指定容器的长度为 num,若容器变长,则以默认值填充新位
    置。如果容器变短,则末尾超出容器长度的元素被删除。
    resize(int num, elem);//重新指定容器的长度为 num,若容器变长,则以 elem 值填
    充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
    capacity();//容器的容量
    reserve(int len);//容器预留 len 个元素长度,预留位置不初始化,元素不可访问。
    

    实例

    void test()
    {
        vector<int> v1(5,100);
        //empty 返回true为空  false非空
        printVectorInt(v1);//100 100 100 100 100
        //重置的size 大于原来的size 多余的部分补0
        //v1.resize(10);
        //printVectorInt(v1);//100 100 100 100 100 0 0 0 0 0
        //重置的size 大于原来的size 多余的部分补2
        v1.resize(10, 2);
        printVectorInt(v1);//100 100 100 100 100 2 2 2 2 2
        //重置的size 小于原来的size 删除多余的部分
        v1.resize(3);
        printVectorInt(v1);//100 100 100
        vector<int> v2(10, 10);
        cout<<"size="<<v2.size()<<", capacity="<<v2.capacity()<<endl;//10 10
        v2.resize(100);
        cout<<"size="<<v2.size()<<", capacity="<<v2.capacity()<<endl;//100 100
        v2.resize(5);
        cout<<"size="<<v2.size()<<", capacity="<<v2.capacity()<<endl;//5 100
        
        vector<int> v3;
        //预留1000个元素
        v3.reserve(1000);
        cout<<v3.capacity()<<endl;
    }
    

    使用swap收缩空间

    void test(){
     vector<int> v1;
        v1.reserve(1000);
        cout<<"size="<<v1.size()<<", 容量="<<v1.capacity()<<endl;
        v1.push_back(10);
        v1.push_back(20);
        v1.push_back(30);
        v1.push_back(40);
        v1.push_back(50);
        cout<<"size="<<v1.size()<<", 容量="<<v1.capacity()<<endl;
    
        //收缩空间大小
        //v1.resize(5);//无法减少容量大小
        vector<int>(v1).swap(v1);
         cout<<"size="<<v1.size()<<", 容量="<<v1.capacity()<<endl;
    }
    

    数据存取

    at(int idx); //返回索引 idx 所指的数据,如果 idx 越界,抛出 out_of_range 异
    常。
    operator[];//返回索引 idx 所指的数据,越界时,运行直接报错
    front();//返回容器中第一个数据元素
    back();//返回容器中最后一个数据元素
    

    实例

    void test()
    {
        vector<int> v1;
        v1.push_back(10);
        v1.push_back(20);
        v1.push_back(30);
        v1.push_back(40);
        v1.push_back(50);
    
        printVectorInt(v1);//10 20 30 40 50
        cout<<v1[2]<<" "<<v1.at(2)<<endl;//30 30
        cout<<"头元素:"<<v1.front()<<" 尾元素:"<<v1.back()<<endl;//10 50
    }
    

    数据插入删除

    insert(const_iterator pos, int count,ele);//迭代器指向位置 pos 插入 count
    个元素 ele.
    push_back(ele); //尾部插入元素 ele
    pop_back();//删除最后一个元素
    erase(const_iterator start, const_iterator end);//删除迭代器从 start 到 en
    d 之间的元素
    erase(const_iterator pos);//删除迭代器指向的元素
    clear();//删除容器中所有元素
    
    void test()
    {
        vector<int> v1;
        v1.push_back(10);
        v1.push_back(20);
        v1.push_back(30);
        v1.push_back(40);
        v1.push_back(50);
        printVectorInt(v1);//10 20 30 40 50
        v1.insert(v1.begin()+2,3, 1000);
        printVectorInt(v1);//10 20 1000 1000 1000 30 40 50
    
        v1.pop_back();//尾部删除 一次删除一个元素
        v1.pop_back();//尾部删除 一次删除一个元素
        printVectorInt(v1);//10 20 1000 1000 1000 30
    
        v1.erase(v1.begin()+2, v1.begin()+5);
        printVectorInt(v1);//10 20 30
    
        //v1.clear();//容器全部清空
        v1.erase(v1.begin(), v1.end());
        printVectorInt(v1);//无数据
    }
    

    容器的嵌套

    void test()
    {
        vector<int> v1(5,100);
        vector<int> v2(3,30);
        vector<int> v3(10,10);
        vector<int> v4(6,50);
    
        vector<vector<int>> v;
        v.push_back(v1);
        v.push_back(v2);
        v.push_back(v3);
        v.push_back(v4);
    
        vector<vector<int>>::iterator it=v.begin();
        for(;it!=v.end();it++)
        {
            //*it的类型为vector<int>
            vector<int>::iterator mit=(*it).begin();
            for(;mit!=(*it).end();mit++)
            {
                //*mit==int
                cout<<*mit<<" ";
            }
            cout<<endl;
        }
    }
    /*
    100 100 100 100 100
    30 30 30
    10 10 10 10 10 10 10 10 10 10
    50 50 50 50 50 50
    */
    

    存放自定数据

    class Person
    {
        friend void test11();
    private:
        int num;
        string name;
        float score;
    public:
        Person(){}
        Person(int num, string name, float score):num(num),name(name),score(score){}
    };
    
    void test()
    {
        vector<Person> v;
    
        v.push_back(Person(100,"lucy", 88));
        v.push_back(Person(101,"bob", 99));
        v.push_back(Person(102,"tom", 77));
        v.push_back(Person(103,"wata", 66));
    
        vector<Person>::iterator it=v.begin();
        for(;it!=v.end();it++)
        {
            //(*it)==Person
            cout<<(*it).num<<" "<<(*it).name<<" "<<(*it).score<<endl;
        }
    }
    

    相关文章

      网友评论

          本文标题:STL容器之vector

          本文链接:https://www.haomeiwen.com/subject/ngknartx.html