最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

STL容器之vector源碼詳細解讀

 更新時間:2024年01月03日 08:56:38   作者:DivineH  
這篇文章主要介紹了STL容器之vector源碼詳細解讀,vector的數(shù)據(jù)安排和array和類似,它們的主要差別在于空間的運用和靈活性,array是靜態(tài)空間,一旦配置了就不能改變,需要的朋友可以參考下

簡介

vector的數(shù)據(jù)安排和array和類似,它們的主要差別在于空間的運用和靈活性,array是靜態(tài)空間,一旦配置了就不能改變

vector是動態(tài)空間,隨著元素的加入,它會自動擴充空間以容納新的元素。

構(gòu)造函數(shù)

// 默認構(gòu)造函數(shù)
explicit vector(const allocator_type& __a = allocator_type())
: _Base(__a) {}

// 構(gòu)造擁有 n 個有值 value 的元素的容器
vector(size_type __n, const _Tp& __value,
        const allocator_type& __a = allocator_type()) 
: _Base(__n, __a)
{ _M_finish = uninitialized_fill_n(_M_start, __n, __value); }

explicit vector(size_type __n)
: _Base(__n, allocator_type())
{ _M_finish = uninitialized_fill_n(_M_start, __n, _Tp()); }

// 拷貝構(gòu)造,構(gòu)造擁有 __x 內(nèi)容的容器
vector(const vector<_Tp, _Alloc>& __x) 
: _Base(__x.size(), __x.get_allocator())
{ _M_finish = uninitialized_copy(__x.begin(), __x.end(), _M_start); }

// 構(gòu)造擁有范圍 [first, last) 內(nèi)容的容器
template <class _InputIterator>
vector(_InputIterator __first, _InputIterator __last,
        const allocator_type& __a = allocator_type()) : _Base(__a) {
typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
_M_initialize_aux(__first, __last, _Integral());
}
// 構(gòu)造擁有范圍 [first, last) 內(nèi)容的容器
vector(const _Tp* __first, const _Tp* __last,
        const allocator_type& __a = allocator_type())
: _Base(__last - __first, __a) 
{ _M_finish = uninitialized_copy(__first, __last, _M_start);

主要函數(shù)

vector中主要有以下幾個內(nèi)部變量:

_Tp* _M_start;  // 表示目前使用空間的頭
_Tp* _M_finish; // 表示目前使用空間的尾
_Tp* _M_end_of_storage; // 表示目前可用空間的尾

其在內(nèi)存中的示意圖如下所示:

在這里插入圖片描述

我們下面主要看vector添加元素的push_back函數(shù)。

push_back

push_back的源代碼如下所示:

// 尾部插入
void push_back(const _Tp& __x) {
if (_M_finish != _M_end_of_storage) { // 有備用空間
    construct(_M_finish, __x);    // 全局函數(shù),將 __x 設(shè)定到 _M_finish 指針所指的空間上
    ++_M_finish;         // 調(diào)整
}
else
    _M_insert_aux(end(), __x);  // 無備用空間,重新分配再插入
}

template <class _Tp, class _Alloc>
void 
vector<_Tp, _Alloc>::_M_insert_aux(iterator __position, const _Tp& __x)
{
  if (_M_finish != _M_end_of_storage) {   // 有備用空間
    construct(_M_finish, *(_M_finish - 1));
    ++_M_finish;
    _Tp __x_copy = __x;
    copy_backward(__position, _M_finish - 2, _M_finish - 1);
    *__position = __x_copy;
  }
  else {  // 沒有備用空間
    const size_type __old_size = size();
    const size_type __len = __old_size != 0 ? 2 * __old_size : 1;
    iterator __new_start = _M_allocate(__len);
    iterator __new_finish = __new_start;
    __STL_TRY {
      __new_finish = uninitialized_copy(_M_start, __position, __new_start);
      construct(__new_finish, __x);
      ++__new_finish;
      __new_finish = uninitialized_copy(__position, _M_finish, __new_finish);
    }
    __STL_UNWIND((destroy(__new_start,__new_finish), 
                  _M_deallocate(__new_start,__len)));
    destroy(begin(), end());
    _M_deallocate(_M_start, _M_end_of_storage - _M_start);
    _M_start = __new_start;
    _M_finish = __new_finish;
    _M_end_of_storage = __new_start + __len;
  }
}

vector插入元素的主要步驟為:

1、判斷備用空間是否已經(jīng)用完;

2、若未用完,則直接在備用空間上插入元素,并更新元素尾指針;

3、若已經(jīng)用完,則重新分配內(nèi)存,并將舊元素復(fù)制到新的地址空間,然后插入新元素。

其中,vector對于空間的增長方式為:

    const size_type __len = __old_size != 0 ? 2 * __old_size : 1;

即初始時,vector的空間為1,后續(xù)每次都會以舊空間的2倍增長。

clear

void clear() { erase(begin(), end()); }
// 清除 [first, last) 中的所有元素
iterator erase(iterator __first, iterator __last) {
    iterator __i = copy(__last, _M_finish, __first);
    destroy(__i, _M_finish);
    _M_finish = _M_finish - (__last - __first);
    return __first;
}

clear是通過調(diào)用erase函數(shù)來完成的,其中,在清除元素時,erase函數(shù)會將未被清除的元素拷貝的vector頭部,然后依次釋放后面的空間,我們不再過多贅述。

特點

1、vector使用的是內(nèi)存中連續(xù)的地址空間,如果已分配的內(nèi)存空間不夠使用時,則vector會以舊容量的2倍來進行擴充,這些都是vector內(nèi)部來完成的,不需要我們?nèi)タ刂疲?/p>

2、vector具有隨機訪問的能力,訪問節(jié)點的效率很高,vector對[]的重載函數(shù)為

reference operator[](size_type __n) { return *(begin() + __n); }  // 重載 [],訪問指定的元素 
iterator begin() { return _M_start; }   // 返回指向容器第一個元素的迭代器 

其中,_M_start為原生指針,原生指針屬于Random access iterator,所以,vector具備了隨機訪問元素的能力。

到此這篇關(guān)于STL容器之vector源碼詳細解讀的文章就介紹到這了,更多相關(guān)vector源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言各種變量的初始化方式

    C語言各種變量的初始化方式

    這篇文章主要介紹了C語言各種變量的初始化方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 詳解C++動態(tài)內(nèi)存管理

    詳解C++動態(tài)內(nèi)存管理

    這篇文章主要為大家詳細介紹了C++中動態(tài)內(nèi)存管理相關(guān)資料,文中示例代碼講解詳細,對我們學(xué)習(xí)C++具有一定幫助,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)
    2023-05-05
  • C++編程之CString、string與、char數(shù)組的轉(zhuǎn)換

    C++編程之CString、string與、char數(shù)組的轉(zhuǎn)換

    這篇文章主要介紹了C++編程之CString、string與、char數(shù)組的轉(zhuǎn)換的相關(guān)資料,希望通過本文能幫助到大家,讓大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-10-10
  • C語言通過案例講解并發(fā)編程模型

    C語言通過案例講解并發(fā)編程模型

    所謂并發(fā)編程是指在一臺處理器上“同時”處理多個任務(wù)。并發(fā)是在同一實體上的多個事件。多個事件在同一時間間隔發(fā)生,下面我們根據(jù)樣例來理解
    2022-04-04
  • C語言實現(xiàn)多線程定時器實例講解

    C語言實現(xiàn)多線程定時器實例講解

    在本篇文章里小編給各位分享的是一篇關(guān)于C語言實現(xiàn)多線程定時器實例講解內(nèi)容,有需要的朋友們可以參考學(xué)習(xí)下。
    2021-01-01
  • 詳解C語言中的字符串拼接(堆與棧)

    詳解C語言中的字符串拼接(堆與棧)

    這篇文章主要介紹了C語言中字符串拼接(堆與棧)的相關(guān)資料,文中通過一段示例代碼詳細介紹了關(guān)于C語言中的字符串拼接問題,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬能頭文件)

    關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬能頭文件)

    #include<bits/stdc++.h>包含了目前 C++ 所包含的所有頭文件,又稱萬能頭文件,那么如何在VS2022中使用萬能頭呢?下面小編給大家代理了關(guān)于VS2022不能使用<bits/stdc++.h>的解決方案(萬能頭文件),感興趣的朋友一起看看吧
    2022-03-03
  • C++超詳細講解字符串類

    C++超詳細講解字符串類

    在C++中只有一個字符串類,即basic_string,其管理著一個 '\0' 結(jié)尾的字符數(shù)組。頭文件:#include <string>,string類支持兩種輸入方式:cin方式和getline()方式
    2022-06-06
  • 簡單講解哈希表

    簡單講解哈希表

    本文主要介紹了哈希表簡單知識及C語言實現(xiàn)哈希表實例,文中利用圖片以及代碼簡單講解了相關(guān)知識,感興趣的小伙伴可以多多學(xué)習(xí)這篇文章
    2021-09-09
  • c語言中比較特殊的輸入函數(shù)舉例詳解

    c語言中比較特殊的輸入函數(shù)舉例詳解

    C語言提供了豐富的標準庫函數(shù),用于處理各種輸入輸出操作,下面這篇文章主要介紹了c語言中比較特殊的輸入函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09

最新評論

绵阳市| 正阳县| 白城市| 石狮市| 广元市| 利川市| 白山市| 商河县| 留坝县| 吉安市| 嘉义县| 屏东市| 新建县| 西和县| 新宾| 内黄县| 青海省| 同仁县| 云和县| 察隅县| 泾源县| 綦江县| 武隆县| 界首市| 旌德县| 灌云县| 乌拉特前旗| 鄢陵县| 荆门市| 进贤县| 米脂县| 宁德市| 水富县| 永和县| 竹溪县| 买车| 蒙阴县| 富蕴县| 新乡县| 思南县| 仙居县|