一、底層實現
vector就是動態陣列.它也是在堆中分配記憶體,元素連續存放,有保留記憶體,如果減少大小後,記憶體也不會釋放.如果新值》當前大小時才會再分配記憶體.
它擁有一段連續的記憶體空間,並且起始位址不變,因此它能非常好的支援隨即訪問,即操作符,但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝,另外,當該陣列後的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體的拷貝。這些都大大影響了vector的效率。
對最後元素操作最快(在後面新增刪除最快 ), 此時一般不需要移動記憶體,只有保留記憶體不夠時才需要
對中間和開始處進行新增刪除元素操作需要移動記憶體,如果你的元素是結構或是類,那麼移動的同時還會進行構造和析構操作,所以效能不高 (最好將結構或類的指標放入vector中,而不是結構或類本身,這樣可以避免移動時的構造與析構)。
訪問方面,對任何元素的訪問都是o(1),也就是是常數的,所以vector常用來儲存需要經常進行隨機訪問的內容,並且不需要經常對中間元素進行新增刪除操作.
二、模擬實現(主要實現了個別介面函式和迭代器)
1.myvector.h
#ifndef myvector_h
#define myvector_h
#include#include"myiterator.h"
using namespace std;
templateclass myvector
myvector(const myvector& src) //拷貝建構函式
_arr = new t[src._valsize];
for (int i = 0; i> 1); //採用1.5倍擴容方式
t* p = new t[_len];
for (int i = 0; i<_valsize i>
if (null != _arr)
_arr = p;
}};templatet& myiterator::operator*()
templatet& myiterator::operator->()
#endif;
2.myiterator.h
#ifndef myiterator_h
#define myiterator_h
#includeusing namespace std;
templateclass myvector;
templateclass myiterator
myiterator(const myiterator*src)
myiterator& operator=(const myiterator& src)
bool operator==(const myiterator& src)
bool operator!=(const myiterator& src)
myiterator& operator++() //後置++
myiterator operator++(int)
myiterator& operator--()
myiterator& operator--(int)
t& operator*();
t& operator->();
};#endif;
3.main.cpp
#include"myvector.h"
#includeusing namespace std;
int main()
v1.show();
cout <::iterator it="v1.begin();
for (it; it != v1.end(); it++)
cout << endl;
return 0;
}
三、執行結果
順序容器vector
vector的關鍵在於其對大小的控制以及重新配置時的資料搬移效率。由於vector維護的是乙個連續線性空間,所以不論元素類別,普通指標都可以作為vector的迭代器而滿足必要條件,包括隨機訪問 操作符 等操作行為。vector提供的是random access iterators。typedef v...
順序容器 vector
vector與array非常相似,唯一的區別在於靈活性,陣列是靜態空間,一旦定義就不能改變,變大變小都需要客戶端自己重新配置新的空間,然後將元素從舊址搬到新址,再把原來的空間還給系統。vector是動態空間,隨著元素的加入,他的內部機制會自行擴充空間以容納新元素。1.vector的底層實現 vect...
STL順序容器 vector
vector是乙個線性順序結構。相當於陣列,但其大小可以不預先指定,並且自動擴 展。它可以像陣列一樣被操作,由於它的特性我們完全可以將vector 看作動態數 組。在建立乙個vector 後,它會自動在記憶體中分配一塊連續的記憶體空間進行資料 儲存,初始的空間大小可以預先指定也可以由vector 預...