STL原始碼分析之Vector

2021-05-24 22:47:28 字數 2442 閱讀 4758

地球人都知道vector的查詢效率很高, 插入和刪除的效率低下, 容器會隨著元素的不斷增加自動增長, 最近在看了stl原始碼之後, 發現確實是這樣, 下面是vector一些關鍵的函式. 從這些函式可以看出插入和刪除的過程, 以及容器自動增長的方式.

// 兩個通過下標獲取元素的函式.

reference operator(size_type __n)

const_reference operator(size_type __n) const

// 給vector重新開拓空間n, 如果n小於原來的capacity就不進行處理

void reserve(size_type __n)

}// 這個函式很關鍵, vector插入的效率和增長過程在這裡體現出來

// 在position位置插入元素__x, 從中可以看出vector的插入需要移動元素, 效率比list低

template

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

// 這樣first即position處就空出來可以存放x

else

__stl_unwind((destroy(__new_start,__new_finish),                         // catch異常之後刪除已經分配的記憶體

_m_deallocate(__new_start,__len)));                        // 析構函式p->~t()

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後面追加乙個元素

void push_back(const _tp& __x)

else

_m_insert_aux(end(), __x);            // 分配空間並在末端插入元素x

}// 在vector __position的位置插入__x

iterator insert(iterator __position, const _tp& __x)

else _m_insert_aux(__position, __x);

return begin() + __n;

}// 在position 後面插入n個值為__x的元素, 如果記憶體不夠, vector會預設分配大於2倍目前size的空間

// 插入完元素之後會把原來記憶體刪除

template

void vector<_tp, _alloc>::_m_fill_insert(iterator __position, size_type __n,

const _tp& __x)

else

}else

__stl_unwind((destroy(__new_start,__new_finish),

_m_deallocate(__new_start,__len)));

destroy(_m_start, _m_finish);                                            // p->~t()

_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()

// 刪除position位置元素, 缺點, 需要移動position後面所有元素

iterator erase(iterator __position)

// 刪除first到last之間的元素, 缺點, 需要一抖last以後所有元素 

iterator erase(iterator __first, iterator __last)

// 把vector大小調整為new size, 如果小於原有size, 直接把後面元素刪除, 如果大於, 則用x初始化後面分配的空間

void resize(size_type __new_size, const _tp& __x)

void resize(size_type __new_size)

// clear實際呼叫erase把所有元素刪除掉

void clear()

STL原始碼分析之vector

vector是序列容器的一種,分配的是一段連續的空間,所以它支援下標訪問,同時它另一特點是可以自行擴充空間,每次是以原大小兩倍來擴充,是另外配置的一塊空間,將原內容拷貝過去,所以當對vector的空間進行重新配置時,指向原vector的迭代器就失效了。下面分析它具體是怎麼實現的和熟悉下vector內...

STL原始碼剖析之vector

向量vector 1.vector概述 vector的資料安排以及操作方式,與array非常相似。兩者的唯一差別在於空間的運用的靈活性。array是靜態空間,一旦配置了就不能改變 vector是動態空間,隨著元素的加入,它的內部機制會自行擴充空間以容納新元素。vector的實現技術,關鍵在於其對大小...

stl原始碼剖析之vector

作者最近在學習c 學習侯捷的stl原始碼剖析這本書,但是我覺得裡面的內容有些古老並且生澀。比如說alloc,對於一些基礎知識不太牢固的同學不是很友好 我建議先細讀第二章前4小節,第一級分配器之後的內容可等基礎足夠再回頭彌補 雖然這本書本就不是面對像菜鳥的c 程式設計師。然一些基礎思想,程式設計方法,...