假定你現在已經能熟練使用vector,如果你很好奇vector背後是怎麼實現的,那麼本文或許對你能有所幫助。
vector代表了c++的動態陣列,大小是動態可增長的。你不必考慮自己手動分配或釋放記憶體,也不必擔心記憶體洩漏,vector幫你做了這一切。vector的使用很簡單,但是要做到有效率,沒那麼容易,了解他背後的實現原理能幫助達到這一目的。
讓我們先看看類的宣告和資料成員:
#include //記憶體分配器標頭檔案,非標準
#include //迭代器標頭檔案,非標準
template //模板類宣告,提供泛型功能。
class vector //返回vetor的首
const_iterator begin() const //唯讀訪問
iterator end() //返回vector的末尾
const_iterator end() const //唯讀訪問
reverse_iterator rbegin() //反向迭代器
const_reverse_iterator rbegin() const //唯讀訪問
reverse_iterator rend() //反向迭代器
const_reverse_iterator rend() const
size_type size() const //size,vector的長度
size_type max_size() const //vector支援的最大長度,4294967295
size_type capacity() const //vector的當前 容量.表示當前的vector有多大的容量。
bool empty() const //判斷vetor是否為空,實現保證這個函式永遠是常量時間複雜度。判斷vector為空間已用empty,不要用size()==0,因為 size()有可能是線性時間複雜度。
reference operator(size_type n) // 操作符
const_reference operator(size_type n) const //唯讀
vector() : start(0), finish(0), end_of_storage(0) {} //預設建構函式
vector(size_type n, const t& value)
finish = start + n;
end_of_storage = finish;
}vector(size_type n)
vector(const vector& x)
end_of_storage = finish;
}vector(const_iterator first, const_iterator last)
end_of_storage = finish;
}~vector()
vector& operator=(const vector& x);
void reserve(size_type n)
}reference front() //返回vector的第乙個元素
const_reference front() const //
reference back() //返回vector的最後乙個元素
const_reference back() const
void push_back(const t& x) else
insert_aux(end(), x); //如果vector容量已滿,進行插入。
}void swap(vector& x)
iterator insert(iterator position, const t& x) else
insert_aux(position, x); //vector的插入需要拷貝調整元素的位置,因而需要拷貝,效率低
return begin() + n;
}iterator insert(iterator position)
void insert (iterator position, const_iterator first,
const_iterator last);
void insert (iterator position, size_type n, const t& x);
void pop_back()
void erase(iterator position)
void erase(iterator first, iterator last)
void resize(size_type new_size, const t& x)
void resize(size_type new_size)
void clear() //清除vector的所有元素,實現保證這個是線性時間的,o(n).
vector的常用介面就說到這裡了,大家可以仔細體會。
vector內部的實現1
寫vector的內部方法 1 include2 using std vector 3 寫乙個動態記憶體45 classca9 ca 10 11 template 12class cstack13 22 template 23void cstack pop 2427 28 template 29 cs...
vector的clear操作的內部過程
最近在論壇看到乙個提問帖子,問題是vector中儲存了物件的指標,呼叫clear後這些指標如何刪除?class test test int main 同時最近又看到一道面試題 對於stl中的vector呼叫clear時,內部是如何操作的?若想將其記憶體釋放,該如何操作?針對以上兩個問題,我們追蹤一下...
vector的clear操作的內部過程
在使用clear時遇到了一些問題,看到網上的資料,寫的很不錯 我也學習到很多。要注意vector儲存指標的問題。最終還是要使用delete依次釋放才行。最近在論壇看到乙個提問帖子,問題是vector中儲存了物件的指標,呼叫clear後這些指標如何刪除?cpp view plain copy clas...