1.vector<Date>::iterator last = find(e.begin(),e.end(),"12/31/95");
*last = "12/30/95";
可能出现的错误:如果find没有找到"12/31/95"迭代器讲返回第二个参数e.end(),而e.end()指向最后一个元素的下一个位置,对这个返回的值解引用和赋值是错误的
2.copy(first,last,ostream_iterator<Date>(cout,"/n"));
可能出现的错误:first在容器中指向的对象要求在last后面,否则这就不是一个有效的范围
3.e是函数内部声明的一个临时对象,e.insert(--e.end(),TodaysDate());
这里引用了e.end(),如果容器e是空的,e.end()有可能指向非有效迭代器
4.把临时对象进行修改在C++中是不允许的
例如下面代码是非法的:
Date *f( );
p = --f( );//错误应该写为"f( ) -1"
f()运行过后就会释放
Date &f( );
p = --f( );//这样就可以了
比如 int f(){static int i;return i;}
int &f(){static int i;return i;}
p = --f( )才可以使用
5.迭代器使用时要注意:
(1)禁止对无效的迭代器进行解引用
*e.end()尤其危险
(2)迭代器有效生存期
(3)迭代器的有效范围,两个迭代器之间要形成有效的范围
(4)对内部类型的非法操作
6.编写一个大小写不敏感的字符串类型
string类型在头文件中被定义为 typedef basic_string<char> string;
模板basic_string<>声明为
template<class charT,
class traits = char_traits<charT>,
class Allocator = allocator<charT>>
class basic_string;
字符串交互的的函数在char_traits ,重新编写一个不同于char_traits的模板,然后定义一个ci_string类,继承string类的其它方法
typedef basic_string<char,ci_char_traits> ci_string;
另外在没有重新定义运算符重载的情况下要使用cout<<或字符串链接+ +=等操作时,要在ci_string后加.c_str()转换成string类的操作
7.LSP:Liskov替换原则:子类型必须能够替换它们的基类型,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别。只有衍生类替换基类的同时软件实体的功能没有发生变化,基类才能真正被复用
8.