摘要:函数模板与类模板是两大类主要的C++泛型编程的使用方法。类模板可以进行模板偏特化和全特化,而函数模板只能进行全特化。但是类不同的是,函数还有一个重要的特性就是重载,如果将函数模板与函数重载的问题放在一块的时候,问题就变得比较麻烦了。 看下面的一个例子:includeusingnamespacestd;templatevoidf(T){coutvoidf(T*){coutvoidf(int*){cout(int*)"voidf(int*){cout(int*)"(int*)即调用的是第3个函数。这儿容易让人疑惑的是,为什么不是第4个函数:templatevoid f(int* 阅读全文
posted @ 2012-08-17 22:49 Mr.Rico 阅读 (304) 评论 (0) 编辑
摘要:1. std::cin和std::cout的类型是什么? 简单的回答,cin实际上是: std::basic_istream> cout实际上是: std::basic_ostream> 首先,cin和cout具有的类型分别是std::istream和std::ostream,接着,这些类型是std::basic_istream和std::basic_ostream的typedef,最后,考虑到模板参数的默认值,得到上面的答案。 #include#includeintmain(intargc,char*argv[]){usingnamespacestd;(argc>2?ofs 阅读全文
posted @ 2012-08-17 21:18 Mr.Rico 阅读 (239) 评论 (0) 编辑
摘要:如果想要删除vector中值为val的元素,最容易想到的方法就是对vector进行遍历,然后遇到值为val时就将其删除。比较好的是vector容器有erase操作。但是这儿需要注意,与list中的erase不同,list的erase操作之后,之前获得的迭代器还是有效的,而在vector中因为vector是顺序存储,所以,一旦删除一个元素,之前获得的迭代器就会失效了,vector.begin()和vector.end()是变化的。注意到,erase的返回值是一个迭代器,而这个迭代器就是指向删除之前元素后的第一个元素。注意到这一点我们可以采用下面的方法实现:voidremove_v(vector& 阅读全文
posted @ 2012-08-17 14:51 Mr.Rico 阅读 (10203) 评论 (0) 编辑
摘要:1.Iterator使用设计准则2. 不区分大小写的string这儿主要是采用修改char_traists的方式来得到与标准库中string类似的类ci_string实例代码如下:View Code #include#include#includeusingnamespacestd;structci_char_traits:publicchar_traits{staticbooleq(charc1,charc2){returntoupper(c1)==toupper(c2);}staticboolne(charc1,charc2){returntoupper(c1)!=toupper(c2); 阅读全文
posted @ 2012-08-17 09:37 Mr.Rico 阅读 (109) 评论 (0) 编辑