zoukankan      html  css  js  c++  java
  • c++学习笔记(六)- vector使用和内存分配

    -----------------------------2019/01/15-------------------------------

    复习了下迭代器,其实c++参考里讲的很清楚,主要需要辨析规则如下:

    1. begin()指向vector第一个元素, end()指向vector最后一个元素的下一个地址(尾后迭代器off-the-end iterator);

    2. insert()是向当前地址前插入,返回第一个插入的元素地址;

    3. erase()是从当前地址开始,向后删除,返回删除以后的下一个地址,如果删除到最后一个元素,返回end()

    具体如图:

     --------------------2019.01.19-------------------------------------------------------------------------

    vector添加时间:push_back<尾部insert<头部insert

        clock_t start, finish;
        std::vector<int> v_data, v_data2, v_data3;
        
        start = clock();
        for(int i = 0;i<200000;i++){
            int data = std::rand()%100;
            v_data.push_back(data);
        }
        finish = clock();
        printf("
    push_back used %.2f ms
    ", (double)(finish-start)*1000/CLOCKS_PER_SEC);
        
        start = clock();
        for(int i = 0;i<200000;i++){
            int data = std::rand()%100;
            v_data2.insert(v_data2.end(), data);
        }
        finish = clock();
        printf("
    insert form tail used %.2f ms
    ", (double)(finish-start)*1000/CLOCKS_PER_SEC);
        
        start = clock();
        for(int i = 0;i<200000;i++){
            int data = std::rand()%100;
            v_data3.insert(v_data3.begin(), data);
        }
        finish = clock();
        printf("
    insert form head used %.2f ms
    ", (double)(finish-start)*1000/CLOCKS_PER_SEC);
    View Code

    输出:

    push_back used 5.43 ms
    insert form tail used 8.39 ms
    insert form head used 2081.38 ms

    -------------------2019.02.06---------------------------------------

    据说emplace_back()比push_back()更快

    -------------------2019.02.09---------------------------------------

    判断两个vector是否相等:

    1. 如果[1,6] [6,1]是不同的vector,直接用==判断即可,stl内置

    2. 如果不考虑元素顺序,且内部没有重复元素,可以用set实现,但是对[1,1,2] vs. [1,2,1]这种无力

    3. 针对1 2不适用的情况,自己琢磨着可能需要先排序再逐个比较

    -------------------2019.02.27--------------------------------------

    vector的初始化

        // 二维
        vector<vector<int>> test = {{1,1},{1,2}};
        for(int i=0;i<test.size();i++){
            for(int j=0;j<test[i].size();j++){
                std::cout<<test[i][j]<<" ";
            }
            std::cout<<std::endl;
        }
        // 一维
        vector<int> desp = {1, 3, 4, 1, 1, 1};
        for(int i=0;i<desp.size();i++){
            std::cout<<desp[i]<<" ";
        }
    View Code

    输出:

    没见过这种初始化方法,之前一直是定义一个数组a[],然后vector<int> v(a,a+sizeof(a)/sizeof(int)),觉得还怪麻烦的,难道是c++新特性?

    1. 定义

    vector 是C++容器种特别常用的一种,用法:vector<int> a;c++11里定义了6种构造函数。

        int aNum[10] = { 1, 3, 5, 6, 9, 11, 13, 15, 17, 19 };    
        vector<int> myVector(2,1);        //定义一个2个元素的vector,并初始化为1
        for (auto it = myVector.begin(); it != myVector.end(); it++)
            cout << *it << ' ';
        cout << endl;
        //用数组aNum的值初始化vector
        vector<int> myNum(aNum, aNum + sizeof(aNum) / sizeof(int));
        for (auto it = myNum.begin(); it != myNum.end(); it++)
            cout << *it << ' ';
        cout << endl;
        //截取myNum的后半部分
        int medium = myNum.size() / 2;
        vector<int> new_nums((myNum.begin() + medium), myNum.end());
        for (auto it = new_nums.begin(); it != new_nums.end(); it++)
            cout << *it << ' ';
        cout << endl;
      //去除myNum向量的前5个元素
        myNum.erase(myNum.begin(), myNum.begin() + 5);

    输出:

    2. insert

    根据 c++ STL中的vector在内存中的分配与释放,vector内容和数组一样,是连续分配内存空间的,不同的是,在给vector分配内存时,会比实际需要的多一些,预留出以后插入的空间。

    根据 c++ reference, 对vector.insert的描述,当向vector的末尾(vector.end())插入时,直接插入就好了,除非预留空间不够,才会重新分配内存。

    如果向vector中间的某个位置插入,那么,由于vector的底层实现还是数组,插入点以后的所有节点都需要重新分配内存。

    这样操作效率很低,所以如果需要向序列中间插入元素,c++ reference建议使用链表。

    3. size

    myVector.size()返回vector里有多少个有效的元素,不是vector实际占用的存储空间。

    myVector.resize(n,val)改变的是vector包含有效元素的个数,如果n<ori,直接扔掉多的那些;n>ori,末尾增加n-ori个新元素,根据val值初始化。如果n超过了capacity,要重新分配内存。

    myVector.capacity返回给vector分配的存储空间。

  • 相关阅读:
    盛最多水的容器
    除自身以外数组的乘积
    组合总和
    旋转图像
    找到所有数组中消失的数字
    RSA加密、签名机制
    SpringBoot-从新建一个项目看起
    linux下vi命令修改文件及保存的使用方法
    集合
    第一个注解式的SpringMVC项目
  • 原文地址:https://www.cnblogs.com/zhengmeisong/p/8046019.html
Copyright © 2011-2022 走看看