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
  • 相关阅读:
    jython resources
    Installing a Library of Jython ScriptsPart of the WebSphere Application Server v7.x Administration Series Series
    jython好资料
    ulipad install on 64bit win7 has issue
    an oracle article in high level to descibe how to archtichre operator JAVA relevet project
    table的宽度,单元格内换行问题
    Linux常用命令大全
    dedecms系统后台登陆提示用户名密码不存在
    登录织梦后台提示用户名不存在的解决方法介绍
    Shell常用命令整理
  • 原文地址:https://www.cnblogs.com/418ks/p/14707199.html
Copyright © 2011-2022 走看看