1.在类内部,声明成员函数是必须的,定义成员函数则是可选的。而若内部定义的成员函数则默认为inline。
2.将关键字const加在形参表之后,即把成员函数声明为常量:int avg_price() const;const成员不能改变其所操作的对象的数据成员,且congst必须同时出现在定义和声明中。
3.当需要将一个对象作为整体引用而不是引用对象的一个成员时,我们使用this指针。
4.ostream&(*)(ostream&),是指返回类型为ostream&,参数类型:ostream&的函数指针类型。
5.友元机制是指允许一个将对其非公有成员的访问权授予指定的函数或者类。C++primer(P397)
6.动态分配的对象只有在指向该对象的指针被删除时候才撤销。由此注意防止内存泄漏。
7.引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(或指针)既可以指向基类对象也可以指向派生类对象,这一事实是动态绑定的关键。 通过动态绑定能编写程序使用继承层次中任意类型的对象,无须关心对象的具体类型。
8.在开始执行构造函数的函数体之前,要完成初始化。必须对任何const或引用类型成员以及没有默认构造函数的类类型的任何成员使用初始化式。初始化列表以冒号开始。
9.给指针只能传地址,不能传值.否则要做强制类型转换.
10.c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.
11.STL-priority_queue(转)
template< class T ,
class Sequence=vector<T> ,
classCompare=less<typename Sequence::value_type> > (主要,要一个空格,否则编译器会当做右移操作符,报错)
class priority_queue;
最简单的用法:
priority_queue<int> q; // 注意上面第二个参数,和第三个参数的默认值。
// 对于内置的对象,可以这么简单的定义;特别注意第三个参数, 默认的小于号(<), 即降序排序,默认的是大根堆。权值最大的会被弹出来。
最常见的用法:
priority_queue<Node> q; // 恩,自己定义的类型。
----------上面两种类型,当自己需要的堆是小根堆的时候,即元素按升序(从小到达的弹出),那么必须改写比较函数.
即对于STL中优先队列的使用,最重要的就是这个比较函数的书写(或对'<', '>'的重载)了,常见的方面有下面两种:
方法一,重载'<' ('>')运算符:
//Overload the < operator.
bool operator< (const Student& structstudent1, const Student &structstudent2)
{ return structstudent1.nAge > structstudent2.nAge; }
//Overload the >
operator.bool operator> (const Student& structstudent1, const Student &structstudent2){ return structstudent1.nAge < structstudent2.nAge; }
具体使用的时候://Declare a priority_queue and specify the ORDER as <//The priorities will be assigned in the Ascending Order of Agepriority_queue<Student, vector<Student>,less<vector<Student>::value_type> > pqStudent1;
----因为默认的less, 所以重载'<'后,第二个参数,第三个参数可以省略//declare a priority_queue and specify the ORDER as >//The priorities will be assigned in the Descending Order of Agepriority_queue<Student, vector<Student>,greater<vector<Student>::value_type> > pqStudent2;
------如果重载的是'>'运算符,必须将第三个参数写出来,greater
方法二,构造‘比较函数’,然后指定priority_queue的第三个参数
struct cmp
{
bool operator() (const Node& a, const Node &b)
{
return a.key > b.key; // 第一个元素大于第二个元素,返回真时; 对应的是小根堆,升序!
} // 当想要大根堆,降序时,让它返回false就好,即用'<' (默认值)
}
多关键字比较、'排序':
struct cmp {
bool operator() (const node &a, const node &b)
{
if (a.current < b.current) return false; //第一关键字,为升序,小根堆 (第一个大于第二的时候,返回真)
else if (a.current == b.current) return (a.year > b.year); // 第二关键字,也为升序
else return true;
}
};
priority_queue<node, vector<node>, cmp> p;
-----------其实这两种方法,很常见。使用STL的algorithm里的sort等算法时,都需要指定!
对于优先队列使用时,特别是多个case的时候,要注意初始的清空!
while ( !q.empty() ) q.pop(); //效率不高?为什么没有提供clear的功能噢。
q.push( cur ); q.top(); q.pop(); q.size();