模擬實現vector 迭代器,型別萃取

2021-08-09 17:36:56 字數 4389 閱讀 5449

vector是c++標準庫中的部分內容,是乙個多功能,能夠操作多種資料機構和演算法的模板類和函式庫。

vector被認為是乙個容器,是因為它能像容器一樣存放各種型別的物件,能夠存放任意型別的動態陣列,能夠增加和壓縮資料。

適合用順序表實現:

#include

#include

using namespace std;

struct truetype

{};struct falsetype

{};template struct typepod

;template<>

struct typepod

;template<>

struct typepod

;template<>

struct typepod

;template<>

struct typepod

;template<>

struct typepod

;templateclass iterator;

templateclass vector

vector(const t* array, size_t size) //陣列傳參

:_start(new t[size]),

_finish(_start + size),

_capacity(_start + size)

}//拷貝建構函式

vector(const vector &v)

vector& operator=(const vector &s)//賦值運算子的過載

return *this;

}//析構函式

~vector()

}///

//////

//////itreator///

//////

////////

iterator begin()

iterator end()

public:

///modify

void

pushback(const t& data) //尾插

void popback() //尾刪

void insert(size_t pos, const t& data) //指定位置插入

_start[pos - 1] = data;

_finish++;

}void erase(size_t pos) //指定位置刪除

_finish--;

}///

//////

//////

///capacity///

//////

//////

//////

///////

size_t size()const

//元素個數

size_t capacity()const

//順序表容量

bool empty()const

//判斷是否為空

return

false;

}void resize(size_t newsize, const t& data = t()) //改變順序表大小

else

if ((newsize > oldsize) && (newsize <= capacity))

}else

}///

//////

///////acess///

//////

//////

//////

//////

t& operator(size_t index) //過載訪問符

const t& operator(size_t index)const

// const過載訪問符

t& front() //首元素

const t& front()const

// const 返回頭部元素

t& back() //返回尾部元素

const t& back()const

void clear() //清空順序表

//輸出運算子過載

templatefriend ostream& operator

<

private:

void _checkcapacity() //分配記憶體

}private:

void _fun(t*dest,const t*src, size_t size, struct truetype) //內建型別

void _fun(t *dest,const t*src, size_t size, struct falsetype) //自定義型別

}protected:

t* _start;

t* _finish;

t* _endofstorage;

};templateclass iterator //迭代器

t& operator *()

t* operator->()

self operator++()

self operator++(int) //後置 ++ 操作符過載

self operator--()

self operator--(int)

bool

operator!=(const self& s) const

bool

operator==(const self& s) const

private:

node *_node;

};

其中:

void _fun(t*dest,const t*src, size_t size, struct truetype)    //內建型別

void _fun(t *dest,const t*src, size_t size, struct falsetype) //自定義型別

}

相當於函式的過載,根據傳的引數不同呼叫不同的函式。

其中

template

struct typepod

;template

<>

struct typepod

;template

<>

struct typepod

;template

<>

struct typepod

;template

<>

struct typepod

;template

<>

struct typepod

;

是模板類,以及特化。

如果t是內建型別,那麼ispod將會是truetype的別名,否則ispod將會是falsetype的別名。

那麼此時ispod的型別將影響到函式的呼叫

_fun(tmp, _start, size, typepod::ispod());
假設此時t的型別是 int

//那麼呼叫函式_fun()將會變為

_fun(tmp,_start,size,typepod::ispod());

//而我們已經將 typepod特化出來,此時的ispod將會是truetype的別名,所以將會呼叫

void _fun(t *dest,const t*src, size_t size, struct falsetype)

//內建型別

使用型別萃取是因為,如果內建型別中有指標資料,如果使用與內建型別相同的memcpy,在物件生命週期結束時,會出現多次釋放同一空間的問題,導致程式崩潰。

同樣的也可以換一種方法:

將上面的一些地方進行修改

struct truetype   

};struct falsetype

};vector(const vector &v)

else

}_finish = _start + size;

_endofstorage = _finish;

}

呼叫過程:

利用c++函式過載,以及模板特化來完成型別萃取。

模擬實現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 ...

STL模擬實現vector

首先給出所需要實現的函式介面和類的封裝 templateclass vector 接下來給出上面介面的具體的實現,但是其中有 型別萃取,因為需要根據不同的資料型別進行不同的賦值方式,從而提高程式的效率。下面給出所有的實現 和我自己的測試 struct truetype struct falsetyp...

stl 模擬實現vector

對於vector相信大家並不陌生,這裡介紹一些重要的vector的介面和用法。1.建構函式 vector 無參構造 vector size type n,const value type val value type 構造並初始化n個val vector inputiterator first,in...