zoukankan      html  css  js  c++  java
  • 3.2 vector容器

    单端数组

    数组是静态空间,但是vector可以动态扩展

    动态扩展:并不是在原空间后续接新空间,而是找更大的内存空间,然后将原数据拷贝到新空间,释放原空间。

    因为没法保证后面的空间是不是空闲的

    vector的迭代器是一个很强大的迭代器,因为它支持随机访问!

    vector是单端数组,因为前端是封闭的,只能从尾部插入和删除,插入命令push_back(),删除pop_back();

    vector的几个常用的迭代器:v.begin()指向容器的第一个元素,v.end()指向容器最后一个元素的下一个位置,v.rbegin指向最后一个元素,v.rend()指向第一个元素的前一个位置;还可以通过insert命令进行插入,erase命令进行删除等。

    #include<iostream>
    #include<vector>
    #include<string>
    using namespace std;
    
    // vector容器的构造
    void printVector(vector<int>& v)
    {
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    void test01()
    {
        vector<int> v1; // 默认构造
        for (int i = 0; i < 10; i++) {
            v1.push_back(i);
        }
    
        printVector(v1); 
    
        vector<int> v2(v1.begin(), v1.end()); // 区间方式
        printVector(v2);
    
        vector<int> v3(10, 100); // n个elem
        printVector(v3);
    
        vector<int> v4(v3); // 拷贝构造
        printVector(v4);
    
    }
    int main()
    {    
        test01();
        return 0;
    }

    vector<int> v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);        
    }
    vector<int> v2;
    v2 = v1;
    vector<int>v3;
    v3.assign(v1.begin, v1.end); // 区间左闭右开
    vector<int> v4;
    v4.assign(10, 100); // 赋值行为

    capacity() >= size()

    resize重新指定大小

    resize更大默认填充0,如果需要改,传入elem

    如果重新指定比原来短,超出部分会删除

    insert注意要提供迭代器

    #include<iostream>
    #include<vector>
    #include<string>
    using namespace std;
    
    // vector容器的插入和删除
    void printVector(vector<int>& v)
    {
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    void test01()
    {
        vector<int> v1;
        // 尾插法
        v1.push_back(10);
        v1.push_back(20);
        v1.push_back(30);
        v1.push_back(40);
        v1.push_back(50);
        printVector(v1);
    
        // 尾删
        v1.pop_back(); // 50删除
    
        // 插入,第一个参数是迭代器
        v1.insert(v1.begin(), 100);
        
        v1.insert(v1.begin(), 2, 100); //在最前面插入2个100
    
        //删除
        v1.erase(v1.begin());
    
        v1.erase(v1.begin(), v1.end()); // 相当于清空
    
        v1.clear(); // 清空操作,跟上面一样
    
    
    }
    int main()
    {    
        test01();
        return 0;
    }

    几个访问元素的方法

    front和back

    互换操作和实际用途

    #include<iostream>
    #include<vector>
    #include<string>
    using namespace std;
    
    // vector容器的互换
    void printVector(vector<int>& v)
    {
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    //
    void test01()
    {
        vector<int> v1;
        for (int i = 0; i < 10; i++)
        {
            v1.push_back(i);
        }
        printVector(v1);
    
        vector<int> v2;
        for (int i = 10; i > 0; i--)
        {
            v2.push_back(i);
        }
        printVector(v2);
    
        v1.swap(v2); // v1和v2容器的内容对应位置进行交换
    
    }
    
    // 实际用途
    // 巧用swap可以收缩内存空间
    void test02()
    {
        vector<int> v;
        for (int i = 0; i < 100000; i++)
        {
            v.push_back(i);
        }
        cout << "v的容量为:" << v.capacity() << endl; // 138255
        cout << "v的大小为:" << v.size() << endl; // 100000
    
        v.resize(3); // 重新指定大小
        cout << "v的容量为:" << v.capacity() << endl; // 138255 剩下空间全部浪费
        cout << "v的大小为:" << v.size() << endl; // 3
    
        // 巧用swap收缩内存
        vector<int>(v).swap(v);
        // vector<int>(v) 匿名对象    会按照v目前的容量初始化这个匿名对象    .swap()容器交换    匿名对象当前行执行完立马回收    目的达成
    }
    
    int main()
    {    
        test02();
        return 0;
    }

    只是找了块空地,不能访问

    有什么用:

    #include<iostream>
    #include<vector>
    #include<string>
    using namespace std;
    
    // vector容器的互换
    void printVector(vector<int>& v)
    {
        for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    //
    void test01()
    {
        vector<int> v1;
        // 统计总共动态扩展了多少次
        // 利用reserse预留空间
        v1.reserve(100000);
        int num = 0;
        int* p = nullptr;
        for (int i = 0; i < 100000; i++)
        {
            v1.push_back(i);
            if (p != &v1[0])
            {
                p = &v1[0];
                num++;
            }
        }
        cout << num << endl; // 30
    }
    
    int main()
    {    
        test01();
        return 0;
    }
  • 相关阅读:
    夺命雷公狗---PDO NO:5 使用PDO执行SQL语句之exec
    夺命雷公狗---PDO NO:4 的错误处理模式
    夺命雷公狗---PDO NO:3与连接有关的选项
    夺命雷公狗---PDO NO:02 链接mysql数据库的DSN
    夺命雷公狗---PDO NO:01 PDO介绍和安装
    夺命雷公狗---oop面向对象 NO:5 魔术方法set和get和isset和unset
    夺命雷公狗---oop面向对象 NO:4 封装
    夺命雷公狗---oop面向对象 NO:3 对象中的构造方法和析构方法
    夺命雷公狗---oop面向对象 NO:2 属性的介绍
    夺命雷公狗---oop面向对象 NO:1 面向对象的简介
  • 原文地址:https://www.cnblogs.com/masbay/p/14294810.html
Copyright © 2011-2022 走看看