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.