C++
LevinLin
本博客现只用于学习用,可能会转载他人的知识,若有涉及到您的版权问题,请与我联系。
> 飛雪迎春到﹐風雨送春歸
> 已是寒崖百丈冰﹐尤有花枝俏
> 俏也不爭春﹐只把春來報
> 待得山花爛漫時﹐他在叢中笑
展开
-
遍历删除map中的元素之注意事项
int main(int argc, char* argv[]){ map mapData; mapData["a"] = "aaa"; mapData["b"] = "bbb"; mapData["c"] = "ccc"; for (map::iterator i=mapData.begin(); i!=mapData.end();转载 2013-11-13 11:22:54 · 4074 阅读 · 0 评论 -
cout与printf
printf与流,不妨也比较一下两个的优缺点。 1. 先说printf的优点,也就这一点了,那就是代码简洁,格式化方便,可以在格式化字符串里一次性将输出格式化。而ostream则需要一段一段地拆分,显得比较烦锁,特别是自定义输出类型的格式时,如格式化输出浮点的小数位数、十六进制输出等,用ostream更烦锁。2.ostream类型安全,而printf则不能保证类型安全。 2.1)p转载 2012-09-21 22:41:00 · 4064 阅读 · 0 评论 -
C++中运算符New的三种使用方式
转自:http://badboywang.iteye.com/blog/4463501. plain new 普通newvoid*operator new(std::size_t)throw(std::bad_alloc); void operator delete( void *) throw(); 该运算符在分配失败时将抛出异常,而非返回NULL。使用时要包含 头文件。正常使用n转载 2012-09-21 20:31:06 · 7331 阅读 · 0 评论 -
请设计一个队列FIFO,要求包含min max mid函数
转载请注明出处:http://blog.csdn.net/shandianling/article/details/7997163解释:min()要求返回队列中的最小值 max()要求返回队列中的最大值 mid()要求返回队列中倒数第(size()+1)/2小的值。说白了就是把队列变成有序后最中间那个值。思想:把两个双向链表,一个保存队列顺序,一个是有序的。然后就整成一个链表原创 2012-09-19 17:47:33 · 1682 阅读 · 0 评论 -
虚函数 虚继承
#include using namespace std;class A{ virtual void aa() { }};class B: public A{public: virtual void bb() { }};class C: public B{public: virtual void cc() { }};int main(){ cout原创 2012-09-17 11:51:09 · 728 阅读 · 0 评论 -
使用Foo f2();f2.bar();带来的问题
class Foo{ public: Foo() {}; Foo(int a) {}; void bar() {};};int main(){ // this works... Foo foo1(1); foo1.bar(); // this does not... Foo foo2(); foo2.bar(); return原创 2012-09-14 22:27:01 · 727 阅读 · 0 评论 -
定义与声明
C++ 程序通常由许多文件组成。为了让多个文件访问相同的变量,C++ 区分了声明和定义。 变量的定义用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 声明用于向程序表明变量的类型和名字。定义也是声明:当定义变量时我们声明了它的类型和名字。可以通过使用 extern 关键字声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型原创 2012-09-14 22:38:32 · 463 阅读 · 0 评论 -
基数+快速排序
#include #include void pr_arr(int a[],int len){ int i=0; for(i=0;i<len;++i) { printf("%d ",a[i]); } printf("\n");}void swap(unsigned int *a,unsigned int *b){ if(*a !=*b) { *a^=*b; *原创 2012-09-16 21:48:45 · 641 阅读 · 0 评论 -
构造函数和析构函数中的虚函数
如果在构造函数或析构函数中调用虚函数,则运行的是为构造函数或析构函数自身类型定义的版本。考虑如果从基类构造函数(或析构函数)调用虚函数的派生类版本会怎么样。虚函数的派生类版本很可能会访问派生类对象的成员,毕竟,如果派生类版本不需要使用派生类对象的成员,派生类多半能够使用基类中的定义。但是,对象的派生部分的成员不会在基类构造函数运行期间初始化,实际上,如果允许这样的访问,程序很可能会崩溃。翻译 2012-04-18 13:35:08 · 525 阅读 · 0 评论 -
static_cast 、dynamic_cast、const_cast 和 reinterpret_cast
3.1 static_cast用法:static_cast ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:①用于类层次结构中基类和子类之间指针或引用的转换。 进行上行转换(把子类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成子类表示转载 2012-04-18 11:18:00 · 424 阅读 · 0 评论 -
STL之sort
STL几乎封装了所有的数据结构中的算法,从链表到队列,从向量到堆栈,对hash到二叉树,从搜索到排序,从增加到删除......可以说,如果你理解了STL,你会发现你已不用拘泥于算法本身,从而站在巨人的肩膀上去考虑更高级的应用。排序是最广泛的算法之一,本文详细介绍了STL中不同排序算法的用法和区别。1 STL提供的Sort 算法C++之所以得到这么多人的喜欢,是因为它既具有面转载 2012-09-21 23:16:19 · 904 阅读 · 0 评论 -
switch 与 if/else
效率问题:见e文。 For just a few items, the difference is small. If you have many items you should definitely use a switch.If a switch contains more than five items, it's implemented using a lookup table原创 2012-09-22 15:46:43 · 540 阅读 · 0 评论 -
数据结构中char[0]的意义
struct MyData { int nLen; char data[0];}; 在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可转载 2013-09-24 22:57:18 · 3347 阅读 · 1 评论 -
C++中的单例模式并非想像得这么简单
C++写单例模式v1版:class Singlon{ private: static Singlon * inst;public: static Singlon& instance() { if(inst != NULL) { return *inst; }转载 2013-09-29 22:48:53 · 849 阅读 · 0 评论 -
64位int类型用printf输出问题
int main(){ long long i=1; long long j=2; long long k=3; printf("%d,%d,%d\n",i,j,k);}输出结果:1,0,2为什么?内存布局查看一下:(这里以4个字节为一组查看,实际应是一个字节) 0x00000000-> 0x00000001 -------------原创 2013-05-12 21:51:55 · 2201 阅读 · 0 评论 -
千万不要把 bool 设计成函数参数
我们有很多 Coding Style 或 代码规范。 但这一条可能会经常被我们所遗忘,就是我们 经常会在函数的参数里使用bool参数,这会大大地降低代码的可读性。 不信?我们先来看看下面的代码。当你读到下面的代码,你会觉得这个代码是什么意思?widget->repaint(false);是不要 repaint 吗?还是别的什么意思?看了文档后,我们才知道这个参数是 im转载 2012-11-16 16:31:37 · 1029 阅读 · 1 评论 -
为什么类的静态成员变量要在类外初始化
1. 在类中,只是声明了静态变量,并没有定义。2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。 注意:如果在类里面这么写int a; 那么是既声明了变量,也定义了变量,两者合在一起了。3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。4. 现原创 2012-11-01 11:34:03 · 6583 阅读 · 2 评论 -
用C++设计一个不能被继承的类
在Java 中定义了关键字final ,被final 修饰的类不能被继承。但在C++ 中没有final 这个关键字,要实现这个要求还是需要花费一些精力。首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那继承的时候,必然会由于试图调用构造函转载 2012-10-21 21:11:43 · 616 阅读 · 0 评论 -
C++中的explicit
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。 C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX原创 2012-10-20 17:19:07 · 582 阅读 · 0 评论 -
私有继承中的派生类对象与基类对象间的转换
class Base{};class Child :private Base //如果是protected也一样。{};那么 Child c; Base b=c;这是不允许的。Base b=c;的意思是把c中的基类的对象赋值给b,但此时Child中的基类对象是private不能被访问。如果改成public就可以。在私有继承中,我知道派生类对象,有什么办法可以访问到其基类的原创 2012-10-29 15:40:16 · 1981 阅读 · 0 评论 -
负数的左移与右移
1)负数的右移:负数右移的话,由于要保持它是负数,所以负数的二进制的右边补1。如果一直右移的话,最后就就变成0xFFFFFFFF 即-1如: -4>>1 为-2 ;-4>>2为-12)负数的左移:跟正整数左移一样,右边补0,一直左移的话,最后就是0啦。-2原创 2012-10-03 22:09:08 · 30760 阅读 · 9 评论 -
关于 delete[]
通常在delete[]一个数组时,编译器要按顺序作如下两件事情: 1. 对每个数组元素调用析构函数 2. 释放对象数组所占内存 注意这是彼此独立的两步. 在第2步.编译器只需简单地把数组首地址告诉操作系统,操作系统内部有内存申请情况的记录(每个申请内存段的首地址,长度,etc..),因此会正确地释放掉内存.注意整个数组所占内存是一次释放掉的,而不是每个元素释放一次.事实上,原创 2012-09-27 23:07:16 · 610 阅读 · 0 评论 -
++i 与 i++
i++相当于int operation++(int &i){ int tmp=i; ++i; return tmp;}可以C/C++中 printf("%d",i++);与printf("%d",++i); cout<<i++; 与cout << ++i; 看看区别.原创 2012-08-31 10:42:45 · 422 阅读 · 0 评论 -
fstream详解
《一》,文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。 文件通常分为二进制文件和文本文件。 二进制文件是包含在 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。 文本文件(也称为ASCII文件):它的每一个字节存放的是可表示为一个字符的ASCII代码的文件转载 2012-05-15 08:42:10 · 884 阅读 · 0 评论 -
C++拷贝构造函数(深拷贝,浅拷贝)
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝。浅拷贝 带来的问题:在某些状况下,类内成员变量需要动态开辟堆内存,如果实行位拷贝,也就是把对象里的值完全复制给另一个对象,如A=B。这时,如果B中有一个成员变量指针已经申请了内存,那A中的那个成员变量也指向同一块内存。这就出现了问题:当B原创 2012-05-06 21:47:46 · 1474 阅读 · 0 评论 -
类模板中的友元
普通友元 非模板类或非模板函数可以是类模板的友元: template class Bar { // grants access to ordinary, nontemplate class and function friend class FooBar; friend void fcn();原创 2012-04-19 19:40:07 · 884 阅读 · 0 评论 -
显式指定函数模板的形参使用的类型
在某些情况下,不可能推断模板实参的类型。当函数的返回类型必须与形参表中所用的所有类型都不同时,最常出现这一问题。在这种情况下,有必要覆盖模板实参推断机制,并显式指定为模板形参所用的类型或值。方法一:可能是强制 sum 的调用者将较小的类型强制转换为希望作为结果使用的类型template T sum(T, U);int i; short s; sum(static_cas原创 2012-04-19 18:20:37 · 3079 阅读 · 0 评论 -
关键概念:名字查找与继承
关键概念:名字查找与继承 理解 C++ 中继承层次的关键在于理解如何确定函数调用。确定函数调用遵循以下四个步骤: 1. 首先确定进行函数调用的对象、引用或指针的静态类型。2. 在该类中查找函数,如果找不到,就在直接基类中查找,如此循着类的继承链往上找,直到找到该函数或者查找完最后一个类。如果不能在类或其相关基类中找到该名字,则调用是错误的。 3. 一旦找到了该名字,就进行翻译 2012-04-18 14:15:12 · 513 阅读 · 0 评论 -
作用域与成员函数
作用域与成员函数在基类和派生类中使用同一名字的成员函数,其行为与数据成员一样:在派生类作用域中派生类成员将屏蔽基类成员。即使函数原型不同,基类成员也会被屏蔽。class Base{public: int Get(){ return 0; }};class Child:public Base{public: int Get(int i){ return i; }转载 2012-04-18 14:04:39 · 1524 阅读 · 0 评论 -
构造函数与初始化
先See代码:#include using namespace std;class Base{public: Base(){} //如果这里不写,会这么样? int m_i;};int main(){ Base b; cout<<b.m_i<<endl; system("pause"); return 0;} 如果没有自己写构造函原创 2012-04-17 13:54:52 · 639 阅读 · 0 评论 -
c++ premier 学习日志
c++ premier 学习日志 第一章 快速入门1. 每个C++程序都包含一个或多个函数,而且必须有一个命名为main。函数由执行函数功能的语句序列组成;2. main函数是唯一被操作系统显式调用的函数;3. main函数的形参个数是有限的4. 函数体是函数定义的最后部分,是以花括号开转载 2012-04-17 13:45:02 · 2631 阅读 · 0 评论 -
模板函数中使用未知类型的容器--如何遍历一个未知容器
templatevoid printList(const T1 & t1){ for(typename T1::const_iterator it =t1.begin(); it!=t1.end(); ++it) { cout<<(*it) << endl; }};如果写得更好,就得重载 operation 请注意 typename T1::con原创 2012-06-28 16:23:37 · 1948 阅读 · 0 评论 -
mutable关键字
在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。原创 2012-06-28 10:19:45 · 437 阅读 · 0 评论 -
类模板的友元声明
在一个模板可以被用在一个类模板的友元声明中之前它的声明或定义必须先被给出#include #include // for size_tusing namespace std;class alloc {};template class deque {public: deque() { cout << "deque" << ' '; }};template原创 2012-06-27 22:28:14 · 1870 阅读 · 0 评论 -
数组与指针的区别
int a[100];char a[10];char *b="ABCD";a是数组,包含的信息不一样,它包含它所在的内存地址,还有长度,而b只是一个指针,它只是刚好指向了一个字符串的地址而已.因为a是一个数组,所以也不像指针一样,可以自增自减,像++a,a--是错误的,但 a+1,a-1是可以编译通过的.原创 2012-08-31 11:08:55 · 378 阅读 · 0 评论 -
operator++()和operator++(int) 区别
++i; // 调用 i.operator++();i++; // 调用 i.operator++(0);原创 2012-08-30 16:31:43 · 1898 阅读 · 0 评论 -
如果依赖的库文件是由低版本gcc编译的怎么办
除了安装低版本的gcc外。可以在/usr/lib中添加对应的libstdc++.so.5试试。有时候它会自动创建libstdc++.so.6文件,所以在make之前要保证libstdc++.so.6没有在/usr/lib里。PS:使用ldconfig会自动创建libstdc++.so.6libstdc++.so.5下载地址:http://ishare.iask.sina.com.c原创 2012-07-06 10:13:57 · 1291 阅读 · 0 评论 -
rename() 解说
#include int rename(const char *oldpath, const char *newpath);//重命名(1) 如果oldname为一个文件:如果newname已存在,而且是一个目录,则不能重命名。 如果newname已存在,而且是一个文件,则先将newname文件先删除,然后将oldname更名为newname。对oldname原创 2012-07-01 15:58:35 · 965 阅读 · 0 评论 -
register volatile 修饰符
register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度。* Procedure for the assignment of structures, */ /* if the C compiler doesn't support this feature */ #ifdef NOSTRUCTASSIGN转载 2012-07-13 16:45:37 · 2599 阅读 · 0 评论 -
static
C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4)栈——增长方向:自顶向下增长;自动变量以转载 2012-07-13 15:56:07 · 457 阅读 · 0 评论