資料結構 變長陣列

2022-08-29 02:39:12 字數 3547 閱讀 5640

剛發現,以前用vector覺得挺簡單的,自己實現一下才知道這麼麻煩。真是佩服那些c++大師,寫出這麼好的東西。

這算是乙個簡易的vector吧,之所以說它簡易,並不是因為功能少,而是實現的複雜度遠遠不及std::vector

但基本原理是一樣的

1#pragma

once23

const

intinit_array_size =10

;4template

<

typename t

>

5class

array611

12t&operator*()

131617t

*operator

->

()18

2122

iterator

&operator

++()

2327

iterator 

operator++(

int)

2833

34iterator

&operator

--()

3539

iterator 

operator--(

int)

4045

46bool

operator!=(

const

iterator 

&it)

4750

51bool

operator==(

const

iterator 

&it)

5255

56bool

operator

<

(const

iterator 

&it)

5760

61iterator 

operator

+(size_t off) 

const

6267

6869

70iterator 

operator

-(size_t off)

7176

77size_t 

operator-(

const

iterator

&it)

7881

8283t*

m_ptr;

84};

85array()

86: m_head(

newt[init_array_size]),

87m_last(m_head),

88m_end(m_head

+init_array_size-1

)89{}90

91array(size_t t)

92: m_head(

newt[init_array_size

t : init_array_size]),

93m_last(m_head

+t),

94m_end(m_head

+(init_array_size

t-1: init_array_size-1

))95

{}9697t

&operator

(size_t t)

98101

102size_t size()

103106

107108

109void

push_back(

constt&

data)

110119

else

//需要擴充長度

120123

}124

125iterator insert(iterator _where, 

constt&

data)

126131

132iterator begin()

133136

137iterator end()

138141

142bool

empty()

143146

147void

remove(iterator _where)

148153

154size_t off 

=_where

-begin();

155156

157158

_move(_where+1

, end(), m_head

+off);

159m_last--;

160}

161162

private

:163

164165

size_t capacity()

166169

170void

_insert(iterator _where, size_t ncount, 

constt&

data)

171183

184t

*temp 

=new

t[newsize];

185186t*

t =temp;

187iterator it 

=begin();

188t 

=_move(begin(), _where, t);

189190t =

_fill(t, t

+ncount, data);

191192

_move(_where, end(), t);

193194

delete m_head;

195196

m_head 

=temp;

197m_last 

=m_head 

+oldsize 

+ncount;

198m_end 

=temp 

+newsize -1

;199

200}

201else

if(end() 

-_where 

<

ncount)

202209

else

210222

}223

224t

*_move(iterator _first, iterator _last, t*p)

225231

232return

p;233

}234

235void

_copy_backward(iterator _first, iterator _last, t*p)

236241

}242

243t

*_fill(iterator _first, iterator _last, 

constt&

data)

244249

250return

_first.m_ptr;

251}

252253t*

m_head;

254t

*m_last;

255t

*m_end;

256};

資料結構與演算法 C 實現動態變長陣列

乙個簡單至極的變長陣列,僅僅是在原生陣列中新增了自動變長功能 參考stl中vector的實現,每次下標越界,就將陣列容量擴大一倍。申請新的空間,是原長度的二倍 從原記憶體複製所有內容到新記憶體 釋放原記憶體 author trialley date 2019 7 26 licence mit pra...

內嵌變長資料結構範例 trbstrmap

以前的 這篇文章 介紹了嵌入的變長資料結構 embeded 本文介紹乙個使用這種思想實現的通用 strmap 容器,相當於 實現上使用了我以前寫的線索紅黑樹 相比標準 map的實現,節省了一半的結點儲存開銷,而平均查詢時間只付出很小的額外開銷,並且沒有 膨脹問題。是可選的,allocator 總在類...

可變長陣列 柔性陣列結構體成員 可變長結構體

可變長陣列是c99相較c89新增的乙個特性。1.可變長陣列無鏈結性,即只在 塊內作用 函式體內或者區域性 塊內 2.可變長陣列不可初始化。3.陣列長度在生存週期不可更改。即n的值不影響str的長度。4.可變長陣列作為函式形參的時候,中使用 其本質是指標。形參中的陣列還可以使用型別限定詞const v...