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++中模板有了一个更深刻的认识.最后是函数模板的用法.
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++中模板有了一个更深刻的认识.最后是函数模板的用法.
相关文章推荐
- 【知识小结】Git 个人学习笔记及心得
- VC++学习心得! 学习c++的50条忠告 (初学者必看)
- c++课程学习心得
- c++学习心得
- c++学习心得
- C++学习心得
- C/C++学习笔记:基础知识2
- c++学习心得
- C++的学习心得
- More Effective C++学习心得
- C++指针学习心得
- 计算机专业知识的学习方法,尤其是对基础掌握不多的初学者---个人学习心得
- C++学习2--坦克大战编写-前置知识
- C++学习心得(3)多态性与虚函数
- javascript学习中的一些心得(基础知识,高手免进)
- C++学习心得【0】----准备
- C++重新学习心得(1)(《C++Primer第四版》1-8章)
- 学习JAVA要不要补充些C/C++的知识
- C++ get知识 ——每天学习一点点
- C++学习心得