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

STL容器之vector源碼詳細(xì)解讀

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

簡(jiǎn)介

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

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

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

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

// 構(gòu)造擁有 n 個(gè)有值 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中主要有以下幾個(gè)內(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 指針?biāo)傅目臻g上
    ++_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對(duì)于空間的增長(zhǎng)方式為:

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

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

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ù)來完成的,其中,在清除元素時(shí),erase函數(shù)會(huì)將未被清除的元素拷貝的vector頭部,然后依次釋放后面的空間,我們不再過多贅述。

特點(diǎn)

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

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

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

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

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

相關(guān)文章

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

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

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

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

    這篇文章主要為大家詳細(xì)介紹了C++中動(dòng)態(tài)內(nèi)存管理相關(guān)資料,文中示例代碼講解詳細(xì),對(duì)我們學(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ā)編程是指在一臺(tái)處理器上“同時(shí)”處理多個(gè)任務(wù)。并發(fā)是在同一實(shí)體上的多個(gè)事件。多個(gè)事件在同一時(shí)間間隔發(fā)生,下面我們根據(jù)樣例來理解
    2022-04-04
  • C語言實(shí)現(xiàn)多線程定時(shí)器實(shí)例講解

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

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

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

    這篇文章主要介紹了C語言中字符串拼接(堆與棧)的相關(guān)資料,文中通過一段示例代碼詳細(xì)介紹了關(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++超詳細(xì)講解字符串類

    C++超詳細(xì)講解字符串類

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

    簡(jiǎn)單講解哈希表

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

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

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

最新評(píng)論

水富县| 通河县| 天峨县| 巴南区| 即墨市| 泽普县| 布尔津县| 宣汉县| 肃北| 三明市| 临桂县| 四会市| 揭阳市| 鹰潭市| 定襄县| 鱼台县| 巩义市| 临猗县| 汉寿县| 竹北市| 崇州市| 始兴县| 耿马| 博乐市| 梁山县| 揭西县| 金川县| 油尖旺区| 桂平市| 新巴尔虎右旗| 曲麻莱县| 陇川县| 宁武县| 堆龙德庆县| 屯留县| 达尔| 敖汉旗| 托里县| 敦化市| 兴业县| 阿尔山市|