zoukankan      html  css  js  c++  java
  • C++ vector实现原理

    1:vector的底层实现原理是数组,占用连续的内存空间

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void init_vector(vector<int> &arr)
    {
        for (int i = 0; i < 10; i++) {
            arr.push_back(i);
        }
    }
    
    void print_vector_addr(vector<int> &arr)
    {
        int length = arr.size();
        for (int i = 0; i < length; i++) {
            cout << "arr[" << i << "]:" << &arr[i] << endl;
        }
    }
    
    int main()
    {
        vector<int> arr;
        init_vector(arr);
    
        print_vector_addr(arr);
    
        return 0;
    }

    运行结果:通过运行结果可看出元素之间的内存是连续的

    2:与普通数组不同,vector是一个动态数组,意思是vector不是大小固定的数组,vector的大小会随着元素的不断变多而变大,vector有两个关键属性,size和capacity。size表示的是vector当前存放了多少个元素,capacity表示的是当前vector总共能存多少个元素。capacity总是大于等于size,如果size已经等于capacity,再往vector中添加元素,此时会重新分配一段更大的内存(原来内存大小的2倍或1.5倍),然后将旧内存中的数据拷贝到新内存,最后释放旧内存。

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void print_size_capacity(const vector<int> &arr)
    {
        cout << "size:" << arr.size() << " capacity: " << arr.capacity() << endl;
    }
    
    void init_vector(vector<int> &arr)
    {
        for (int i = 0; i < 10; i++) {
            arr.push_back(i);
         cout << "arr[0]:" << &arr[0] << endl; print_size_capacity(arr); } }
    void print_vector_addr(vector<int> &arr) { int length = arr.size(); for (int i = 0; i < length; i++) { cout << "arr[" << i << "]:" << &arr[i] << endl; } } int main() { vector<int> arr; init_vector(arr); return 0; }

    运行结果:首元素地址在变,说明会新分配内存,同时能看到capacity总是大于等于size

    3:vector有两个函数resize(size_t count)和reserve(size_t count)。resize改变vector的size,如果增大size导致capacity不够存储,capacity也会被改变,如果减小size,之前多出来的元素被删除,capacity不变。reverse改变capacity,只能增加,减小不会生效。

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void print_size_capacity(const vector<int> &arr)
    {
        cout << "size:" << arr.size() << " capacity: " << arr.capacity() << endl;
    }
    
    void init_vector(vector<int> &arr)
    {
        for (int i = 0; i < 10; i++) {
            arr.push_back(i);
        }
    }
    
    int main()
    {
        vector<int> arr;
        init_vector(arr);
        print_size_capacity(arr);
    
        // 新加size
        arr.resize(30);
        cout << "增加size:" << endl;
        print_size_capacity(arr);
    
        // 减小size
        arr.resize(10);
        cout << "减小size:" << endl;
        print_size_capacity(arr);
    
        // 增加capacity
        arr.reserve(40);
        cout << "增加capacity:" << endl;
        print_size_capacity(arr);
    
        // 减小capacity
        arr.reserve(30);
        cout << "减小capacity:" << endl;
        print_size_capacity(arr);
    
        return 0;
    }

    运行结果:

    tips:使用vector时,不断插入元素,会导致不断的重新分配内存然后拷贝内存,效率低。建议在确定大概需要多少内存时,用reserve先分配好内存,提高效率。

    https://i.cnblogs.com/posts?categoryid=0
  • 相关阅读:
    Java中的责任链设计模式,太牛了!
    醒醒吧,世界上有技术驱动型公司!
    现身说法:37岁老码农找工作
    如何快速安全的插入千万条数据?
    这个函数,1987年在这了,别动它!
    word自动备份,word误删内容恢复
    给Ubuntu 16.04更换更新源
    Django分别使用Memcached和Redis作为缓存的配置(Linux环境)
    Pycharm远程连接服务器,并在本地调试服务器代码
    Navicat远程连接阿里云服务器的mysql
  • 原文地址:https://www.cnblogs.com/418ks/p/14707199.html
Copyright © 2011-2022 走看看