要了解vector,list,deque。我們先來(lái)了解一下STL。

STL是Standard Template Library的簡(jiǎn)稱,中文名是標(biāo)準(zhǔn)模板庫(kù)。從根本上說(shuō),STL是一些容器和算法的集合。STL可分為容器(containers)、迭代器(iterators)、空間配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函數(shù)(functors)六個(gè)部分。指針被封裝成迭代器,這里vector,list就是所謂的容器。
我們常常在實(shí)現(xiàn)鏈表,棧,隊(duì)列或者數(shù)組時(shí),都會(huì)寫著一些重復(fù)或者相似的代碼,還要考慮各種可能出現(xiàn)的問(wèn)題。而STL的引入,大大提高了代碼的復(fù)用性。我們?cè)趯?shí)現(xiàn)這些代碼時(shí),只要引入頭文件就可以靈活的應(yīng)用了。
vector的使用
連續(xù)存儲(chǔ)結(jié)構(gòu):vector是可以實(shí)現(xiàn)動(dòng)態(tài)增長(zhǎng)的對(duì)象數(shù)組,支持對(duì)數(shù)組高效率的訪問(wèn)和在數(shù)組尾端的刪除和插入操作,在中間和頭部刪除和插入相對(duì)不易,需要挪動(dòng)大量的數(shù)據(jù)。它與數(shù)組大的區(qū)別就是vector不需程序員自己去考慮容量問(wèn)題,庫(kù)里面本身已經(jīng)實(shí)現(xiàn)了容量的動(dòng)態(tài)增長(zhǎng),而數(shù)組需要程序員手動(dòng)寫入擴(kuò)容函數(shù)進(jìn)形擴(kuò)容。
Vector的模擬實(shí)現(xiàn)
template <class T>
class Vector
{
public:
typedef T* Iterator;
typedef const T* Iterator;
Vector()
:_start(NULL)
,_finish(NULL)
,_endOfStorage(NULL)
{}
void template<class T>
PushBack(const T& x)
{
Iterator end = End();
Insert(end, x);
}
void Insert(Iterator& pos, const T& x)
{
size_t n = pos - _start;
if (_finish == _endOfStorage)
{
size_t len = Capacity() == 0 ? 3 : Capacity()*2;
Expand(len);
}
pos = _start+n;
for (Iterator end = End(); end != pos; --end)
{
*end = *(end-1);
}
*pos = x;
++_finish;
}
Iterator End()
{
return _finish;
}
Iterator Begin()
{
return _start;
}
void Resize(size_t n, const T& val = T())//用Resize擴(kuò)容時(shí)需要初始化空間,并且可以縮小容量
{
if (n < Size())
{
_finish = _start+n;
}
else
{
Reserve(n);
size_t len = n-Size();
for (size_t i = 0; i < len; ++i)
{
PushBack(val);
}
}
}
void Reserve(size_t n)//不用初始化空間,直接增容
{
Expand(n);
}
inline size_t Size()
{
return _finish-_start;
}
inline size_t Capacity()
{
return _endOfStorage-_start;
}
void Expand(size_t n)
{
const size_t size = Size();
const size_t capacity = Capacity();
if (n > capacity)
{
T* tmp = new T[n];
for (size_t i = 0; i < size; ++i)
{
tmp[i] = _start[i];
}
delete[] _start;
_start = tmp;
_finish = _start+size;
_endOfStorage = _start+n;
}
}
T& operator[](size_t pos)
{
assert(pos < Size());
return _start[pos];
}
const T& operator[](size_t pos) const
{
assert(pos < Size());
return _start[pos];
}
protected:
Iterator _start; //指向第一個(gè)元素所在節(jié)點(diǎn)
Iterator _finish; //指向最后一個(gè)元素所在節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
Iterator _endOfStorage; //可用內(nèi)存空間的末尾節(jié)點(diǎn)
};
本文名稱:Java中的vector和list的區(qū)別和使用實(shí)例詳解-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://chinadenli.net/article38/ddpppp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、服務(wù)器托管、標(biāo)簽優(yōu)化、動(dòng)態(tài)網(wǎng)站、App設(shè)計(jì)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容