地球人都知道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 程式設計師。然一些基礎思想,程式設計方法,...