STL之vector學習筆記

2021-08-03 20:37:56 字數 3340 閱讀 7203

參考sgi stl 及 侯捷《stl原始碼剖析》

概述

vector是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新元素。但是它不是單純地 配置新空間->資料移動->釋放舊空間,它實際配置的大小會比客戶需求要大一點
定義

sgi stl的vector實現於stl_vector.h中,而不是vector.h中。
//_alloc是空間配置器

template

class

vector : protected _vector_base<_tp _alloc>

----------

typedef _tp value_type; //vector的class _tp的別名為value_type

//定義了各種指標、迭代器、引用的別名

typedef value_type* pointer;

typedef

const value_type* const_pointer;

typedef value_type* iterator;

typedef

const value_type* const_iterator;

typedef value_type& reference;

typedef

const value_type& const_reference;

typedef size_t size_type;

typedef ptrdiff_t difference_type;

----------

#ifdef __stl_has_namespaces

using _base::_m_allocate;

using _base::_m_deallocate;

using _base::_m_start; //表示目前使用空間的頭

using _base::_m_finish; //表示目前使用空間的尾

using _base::_m_end_of_storage; //表示目前可用空間的尾

#endif /* __stl_has_namespaces */

----------

vector的迭代器

vector維護的是乙個連續線性空間,支援隨機訪問,所以vector提供的是random access iterators
vector的資料結構

使用三個指標來指示整個空間
using _base::_m_start;      //表示目前使用空間的頭

using _base::_m_finish; //表示目前使用空間的尾

using _base::_m_end_of_storage; //表示目前可用空間的尾

vector的構造與記憶體管理

vector的實際可用空間將會比需要的空間大一些,一旦容量等於空間大小,將會將容量擴充兩倍
//建構函式

explicit

vector(const allocator_type& __a = allocator_type())

: _base(__a) {}

vector(size_type __n, const _tp& __value,

const allocator_type& __a = allocator_type())

: _base(__n, __a)

explicit

vector(size_type __n)

: _base(__n, allocator_type())

vector(const

vector

<_tp _alloc>& __x)

: _base(__x.size(), __x.get_allocator())

//填充並初始化

vector的元素操作

//將元素插到最末端

void push_back(const _tp& __x)

else

//沒有備用空間

_m_insert_aux(end(), __x);

}

iterator insert(iterator __position, const _tp& __x) 

else

_m_insert_aux(__position, __x);

return begin() + __n;

}template

void

vector

<_tp _alloc>::_m_insert_aux(iterator __position, const _tp& __x)

else

//釋放舊空間,並重新調整各個迭代器的值

__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;

}}

//將尾端元素取出

void pop_back()

//清除某位置上的元素

iterator erase(iterator __position)

iterator erase(iterator __first, iterator __last)

STL學習筆記(三) vector

1 定義 建構函式 1 vector vec 的內容根據儲存型別定,如char short long char string 同時結構體亦可以,其未定義大小 struct st voctor vec 2 vector vec1 6 大小為6,值預設為0 3 vector vec2 6,8 大小為6,...

STL 學習之vector測試

vector 是向量陣列,一端開口的陣列,其記憶體結構圖如下所示 可見其在尾部插入資料速度很快,而在其他地方插入資料將會很慢 void testvector vectortest vec clock t timestart clock for long i 0 i ran max i catch e...

STL學習筆記 陣列(vector)

2.屬性 3.操作 4.運算子過載 5.兩個演算法 關鍵字 引數列表 變數名 關鍵字 容器名字 類名 引數列表 容器的資料型別 2.容器的資料型別 基本資料型別 eg int char 本質和string一樣 結構體指標 物件 普通類物件 同結構體 其他容器物件 string沒有引數列表 strin...