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先分配好內存,提高效率。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM