剛發現,以前用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...