vector是表示可變大小陣列的序列容器。
就像陣列一樣,vector也採用的連續儲存空間來儲存元素。也就是意味著可以採用下標對vector的元素進行訪問,和陣列一樣高效。但是又不像陣列,它的大小是可以動態改變的,而且它的大小會被容器自動處理。
本質講,vector使 用動態分配陣列來儲存它的元素。當新元素插入時候,這個陣列需要被重新分配大小為了增加儲存空間。其做法是,分配乙個新的陣列,然後將全部元素移到這個陣列。就時間而言,這是乙個相對代價高的任務,因為每當乙個新的元素加入到容器的時候,vector並不會每次都重新分配大小。
vector分配空間策略: vector會分配一些額外的空間以適應可能的增長 ,因為儲存空間比實際需要的儲存空間更大。不同的庫採用不同的策略權衡空間的使用和重新分配。但是無論如何,重新分配都應該是對數增長的間隔大小,以至於在末尾插入乙個元素的時候是在常數時間的複雜度完成的。
因此,vector占用了更多的儲存空間,為了獲得管理儲存空間的能力,並且以一種有效的方式動態增長。
與其它動態序列容器相比(deques, lists and forward_ lists), vector在訪問元素的時候更加高效, 在末尾新增和刪除元素相對高效。對於其它不在末尾的刪除和插入操作,效率更低。比起lists和 forward_ists統一 的迭代器和引用更好。
#include
#include
#include
#include
using
namespace std;
namespace zd
iterator end()
constiterator cbegin()
const
constiterator cend()
const
size_t size()
size_t capacity()
size_t size()
const
size_t capacity()
const
//建構函式
/*vector()
:_start(nullptr)
, _finish(nullptr)
, _endofstorage(nullptr)
{}*/
vector()
=default
;//拷貝構造
vector
(const vector
& v)
_finish = _start + v.
size()
; _endofstorage = _start + v.
capacity()
;}/*vector& operator=(vectorv)
_finish = _start + v.size();
_endofstorage = _start + v.capacity();
}return *this;
}*/vector
&operator
=(vector v)
void
swap
(vector v)
//析構函式
~vector()
}//reverse()函式用於容器預留空間
void
reserve
(size_t n)
} _start = tmp;
_finish = _start + size;
_endofstorage = _start + n;}}
//改變容器的大小,並建立物件
void
resize
(size_t n,
const t& value =t(
))else
while
(_finish != _start + n)}}
void
pushback
(const t& x)
*_finish = x;
_finish++;*/
insert
(end()
, x);}
void
popback()
void
insert
(iterator pos,
const t& x)
iterator end = _finish;
while
(end > pos)
*pos = x;
_finish++;}
//返回刪除資料的下乙個資料
//方便解決:一邊遍歷一邊刪除的迭代器失效問題
void
erase
(iterator pos)
_finish--;}
t&operator
(size_t pos)
const t&
operator
(size_t pos)
const
private
: iterator _start =
nullptr
;//nullptr是預設值
iterator _finish =
nullptr
; iterator _endofstorage =
nullptr;}
;void
vectortest1()
cout << endl;
v1.resize(3
);vector<
int>
::iterator it1 = v1.
begin()
;while
(it1 != v1.
end())
cout << endl;
v1.popback()
; vector<
int>
::iterator it2 = v1.
begin()
;while
(it2 != v1.
end())
cout << endl;
v1.resize(10
,1);
for(
auto e : v1)
cout << endl;
}void
vectortest2()
for(size_t i =
0; i < v2.
size()
; i++
) cout << endl;
pos = std::
find
(v2.
begin()
, v2.
end(),
3); v2.
erase
(pos)
;for
(size_t i =
0; i < v2.
size()
; i++
) cout << endl;
}void
vectortest3()
cout << endl;
vector<
int> v4;
v4.pushback(1
);v4.
pushback(2
);v4.
pushback(3
);for(size_t i =
0; i < v4.
size()
; i++
) cout << endl;
v4 = v3;
for(size_t i =
0; i < v4.
size()
; i++
) cout << endl;
}void
vectortest4()
cout << endl;}}
intmain()
模擬實現vector
include include using namespace std template class vector 向vector中存入size個元素 vector const t array,size t size start new t size endofstorage start size ...
vector的模擬實現
上一節部落格講述了vector常見介面的使用,今天主要是對vector這些介面進行模擬實現,下面是相關 include include includeusing namespace std namespace ty iterator end citerator cbegin const citera...
vector的模擬實現
最近學習了vector的使用,下面對vctor進行了模擬實現,如有不足請指出 include include include using namespace std template class t class vector 大小 size t size const 容量 size t capaci...