您的位置:首页 > 编程语言 > C语言/C++

C++知识学习心得

2006-04-28 18:59 651 查看
最近比较空又巩固了一些C++知识, 比如STL库的用法, 模板等. 主要看的书是<C++编程思想>第二卷,感觉写的不错, 对C++的了解有深入了一层.现在将学习中遇到的问题做一个整理.

1.   template<class T, int size>  int  ArraySize(T (&)[size]){return size;}

这个函数可以返回任何数组的位数大小,用法是直接传入数组名.觉得很神奇.

2. char* a={"dfs", "dfsdf", "eoojdf"} ; int n=sizeof a/sizeof *a;  n的值为数组的中元素的个数, 注意这里的sizeof竟然没有括号, 而通常的方法是n=sizeof(a)/sizeof(a[0]). 不知何解?

3.#include <cstdlib>
#include <cstring>
template<class T>
void getmem(T*& oldmem, int elems) {
typedef int cntr; // Type of element counter
const int csz = sizeof(cntr); // And size
const int tsz = sizeof(T);
if(elems == 0) {
free(&(((cntr*)oldmem)[-1]));

return;
}
T* p = oldmem;
cntr oldcount = 0;
if(p) { // Previously allocated memory
// Old style:
// ((cntr*)p)--; // Back up by one cntr
// New style:

 // Previous # elems
}
T* m = (T*)realloc(p, elems * tsz + csz);
require(m != 0);
*((cntr*)m) = elems; // Keep track of count
const cntr increment = elems - oldcount;
if(increment > 0) {
// Starting address of data:
long startadr = (long)&(m[oldcount]);
startadr += csz;
// Zero the additional new memory:
memset((void*)startadr, 0, increment * tsz);
}
// Return the address beyond the count:
oldmem = (T*)&(((cntr*)m)[1]);
}

这段程序的目的是模仿realloc的,看到其中经典的了吗?那就是

free(((cntr*)m)[-1]);注意这里是-1.

cntr* tmp = reinterpret_cast<cntr*>(p);
p = reinterpret_cast<T*>(--tmp);
oldcount = *(cntr*)p;这段代码的目的是为了得到改段内存的大小,是上次调用getmem是故意放进去的.真是佩服大师的手臂啊.

4. template<class Seq, class T, class R,
class A1, class A2>
void apply(Seq& sq, R(T::*f)(A1, A2),
A1 a1, A2 a2) {
typename Seq::iterator it = sq.begin();
while(it != sq.end()) {
((*it)->*f)(a1, a2);
it++;
}
}

template<class Container, class PtrMemfun>
void  apply(Container& c, PtrMemfun f)
{
 typename  Container::iterator iter=c.begin();
 for(; iter!=c.end(); iter++)
 {
 // (iter->*f)();
  ((*iter).*f)();
 }
}

这两段程序有什么本质的区别吗?为什么一个那么简单明了,一个那么复杂?

5.template<typename T, template<typename> class C>

void print2(C<T>& c) {
copy(c.begin(), c.end(),
ostream_iterator<T>(cout, " "));
cout << endl;
}
int main(){vector<string> v(5, "Yow!");
print1(v);
print2(v);
}

这个好像在vc7.0下编译通不过不知道问题在哪里?

花了一个多星期将500页的英文pdf看完,真累啊,但还是有很大

的收获,首先知道了stl库还有那么多用法,和那么多好用的算法.如果在以后的开发中能善用之,将会大大减少程序的复杂度和代码量.其次,是对c++中模板有了一个更深刻的认识.最后是函数模板的用法.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息