1.sort
对于vector可以直接用,list却必须传递cmp比较函数
2.iterator
模板中,(template<typename T>
)
vector::iterator itera;
似乎只能在while循环体内进行迭代器自增,不能在for括号内进行迭代器自增
例如:
vector<int> the_vector;
vector<int>::iterator the_iterator;
for( int i=0; i < 10; i++ )
the_vector.push_back(i);
int total = 0;
the_iterator = the_vector.begin();
while( the_iterator != the_vector.end() ) {
total += *the_iterator;
the_iterator++;
}
cout << "Total=" << total << endl;
但是特别的要说明的是,当类型变量(T)作为参数导出iterator时(vectot::iterator)*,为了编译通过
需要
typename vector<T>::iterator itera;
此时迭代器itera可以在for,while循环里使用
template <typename T> void vector_print(vector<T>v){
typename vector<T>::iterator itera;
for(itera=v.begin();itera!=v.end();++itera){
cout<<*itera<<" ";
}
}
3.有默认参数的函数
带默认参数的函数声明时注明默认参数即可,当声明与定义分离时,不能在定义中再指定一个默认值(即使与声明的是同一个值)
4.EOF
cstdio也即stdio.h才有这个宏定义
5.const
函数名后加const
bool Stack:: isempty()const;//声明
bool Stack:: isempty()const{}//定义
事实上,在函数名后加const只会出现在类的方法定义上,表明这个方法成员不可变,
又因为this是隐藏的第一个参数,所以实质要求是方法不能修改实例的属性isempty、isfull
front、back等都可以后面加const预防意外修改实例属性。
6.模板定义应该与声明放在同一个头文件里
对于某些实现了export关键字的编译器可以分开放、头文件放声明,export模板
定义单独放在一个源文件里,包含头文件。(反正gcc、vs都没有实现,)
7.类初始化中的单引号
本条援引 http://blog.youkuaiyun.com/chw1989/article/details/7480375
初始化的顺序与成员变量声名的顺序相同。
先看一下下面的程序:
myClass::myClass():b(1),a(b)
{
}
这样的执行结果a,b各是多少呢?b=1,a=1?不是,b=1而a是个随机数。这一点是相当重要的哦,一般在初始化列表中进行初始化时,初始化的顺序应与声明的顺序保持一致,防止出现不必要的错误。
3)对于继承的类来说,在初始化列表中也可以进行基类的初始化,初始化的顺序是先基类初始化,然后再根据该类自己的变量的声明
为什么呢,因为:
myClass::myClass()
{
a = 1;// 没错,效果相当于在初始化列表中进行初始化
b = 1;// 出错,const变量不能进行赋值操作;
}
8.静态(static)成员初始化
参见这篇博文:
http://www.cnblogs.com/fre2technic/archive/2011/03/25/1995044.html
9.明明直觉上同Java那么像,但创建对象的思路迥异!!
C++ 对象只要声明变量, 就算创建, 但是要考虑栈上的对象与堆上的对象的不同, 栈对象会回收
堆对象需要 new 与 delete ……
总之C++就是四不像