啥都不說,先上代碼
static void vector_array_test(void){ VECTOR v; ARRAY a; int aa[5];int b = 0; VECTOR_INIT(v, int); VECTOR_RESIZE(v, 5, int); ARRAY_INIT(a, 5, int);#define OUT(x) printf("%d\n", x)#define IN(x) scanf("%d", &x)#define FILL_INCREASE(x) x = ++b#define FILL_DECREASE(x) x = --b FOR_EACH(VECTOR_BEGIN(v), VECTOR_END(v), VECTOR_ITERATOR, int, FILL_INCREASE); FOR_EACH(VECTOR_BEGIN(v), VECTOR_END(v), VECTOR_ITERATOR, int, OUT); FOR_EACH(ARRAY_BEGIN(a), ARRAY_END(a), ARRAY_ITERATOR, int, FILL_DECREASE); FOR_EACH(ARRAY_BEGIN(a), ARRAY_END(a), ARRAY_ITERATOR, int, OUT); FOR_EACH(aa, aa + 5, ARRAY_ITERATOR, int, IN); FOR_EACH(aa, aa + 5, ARRAY_ITERATOR, int, OUT);COPY(aa, aa + 5, ARRAY_ITERATOR, int, VECTOR_BEGIN(v), VECTOR_ITERATOR, int);FOR_EACH(VECTOR_BEGIN(v), VECTOR_END(v), VECTOR_ITERATOR, int, OUT);VECTOR_DESTROY(v); ARRAY_DESTROY(a);}
是不是感覺有點熟悉啊,呵呵,這就是C語言版STL,容器,迭代器,演算法,函數對象,一個都不少。注意演算法FOR_EACH支援函數,宏,用C++編譯器也支援c++函數對象。而且宏FILL可以訪問up_value,也就是代碼中的局部變數b!這一點徹底超越了c++的stl喲,喜歡函數編程的朋友也許會開心一陣子咯。
不過,這畢竟是C語言,我們不得不在演算法中直接寫下iterator_trait類型,還要把元素類型給寫出來,還請多多包涵,嘿嘿。
當然,那些羅哩羅嗦的流迭代器啊,從此和他們說拜拜吧,鄙人也不想費力不討好的去類比那些屠龍術了。
鄙人已經完成了容器中的數組,向量,雙向鏈表,演算法挑了幾個有代表性的來實現,用於測試容器迭代器迭代效能和各種類型迭代器的適配。完成度少說也有60%左右了吧,先想拿出部分來給大家瞧瞧,看看有啥問題沒。