妳把typedef set::const _ iterator CIT;改為typedef set::const _ iterator CIT;可以編譯壹下!
妳的問題問完了,但我還有話要說。如果妳書裏的代碼真的是這樣的,可以直接扔掉。根本不值得看,誤導人,害人。當然,我會告訴妳原因:
原罪壹:
集合模板類定義的原型是
模板& ltclass T,// set::key_type/value_type
class Compare = less,//set::key _ Compare/value _ Compare
class Alloc = allocator//set::allocator _ type
& gt類集;
這裏的第壹個參數是妳要存儲的數據類型,第二個參數和第三個參數是可選的,第二個參數默認為less,是壹個函數對象(重載了括號運算符)其定義如下:
無模板結構:binary_function {
布爾運算符()(const T & ampx,const T & ampy)const { return x & lt;y;}
};
也就是說,less是指使用字符串的小於號作為排序標準(可以改為greater按大於號排序);不說第三個了!
所以typedef set::const _ iterator CIT;嚴格來說,這個東西是不正確的,妳也搞不清楚它要做什麽。作為排序標準,字符串是否大於符號?小於符號?我剛查了壹下,string沒有重載operator(),所以不是函數對象;但是不知道VS2013和G++能不能編譯!
原罪2:
我們來看看這個模板函數的定義,顯然不是面向對象的思維,而是面向過程(C語言)的思維模式。
模板
虛空展(CIT & ampit,set & amps)
{
for(it = s . begin();它!= s . end();++it)
{
cout & lt& lt* it & lt& lt”\ t”;
}
cout & lt& ltendl
}
C++的實踐是怎樣的
模板
無效顯示(常量集& amps)
{
for(typename set::const _ iterator citer = s . begin();citer!= s . end();++citer)
{
cout & lt& lt* citer & lt& lt”\ t”;
}
cout & lt& ltendl
}
我來解釋壹下,函數是輸出集合容器中的每壹個元素。很明顯,只需要傳入壹個參數。為什麽有兩個?太奇怪了。
原罪三:(這部分可以商量)
再看看這段精彩的代碼。
const int N = 5;
string s1[N]={"mick "," bill "," gate "," rose "," Jane " };
String s2[N]={ "張峰","秦萍","李莉","房鹿","胡濤" };
setname 1;
name1.insert(s1,s 1+N);
setname2(s2,S2+N);
首先,這裏定義了兩個臨時數組s1和s2。從這個角度來說,就是使用數組的唯壹初始化列表(C++11標準之後也支持set),但是從這個例子中我們看不到這樣使用的好處!
而且name1和name2的構造方法不同(第壹個使用默認構造函數+插入成員函數,第二個使用特定的構造函數),這在現在這個程序中顯然很難解釋。
更合適的方法是:
集合名稱1;
name 1 . insert(" Mick ");
name 1 . insert(" bill ");
name 1 . insert(" gate ");
name 1 . insert(" rose ");
name 1 . insert(" Jane ");
集合名稱2;
Name2.insert("張峰");
Name2.insert("秦萍");
name 2 . insert(" Lili ");
Name2.insert("房鹿");
Name2.insert("胡濤");
壹目了然,所以有人可能會說,元素多了,這樣的代碼就難看了,妳其實應該把這些字符串放到壹個文件裏,然後由程序讀取,用insert插入到集合裏。
原罪4:
cout & lt& lt找出name2中大於“Li Li”的第壹個元素。\ n ";
cit = name 2 . upper _ bound(" Li Li ");
cout & lt& lt*cit<。& ltendl
Set在英語中是按照字典順序排序的,而漢字不是很確定。例如,在linux下運行G++的結果是:
查找name2中大於的第壹個元素。
秦萍
註:第二名的順序是:張峰、李莉、秦萍、胡濤和房鹿(非拼音順序)。
而在windows下用VS運行的結果是:
查找name2中大於的第壹個元素。
房鹿(按拼音順序)
所以這裏根本不用漢字做例子,用英文單詞也不會有異議!
原罪五:
整個程序的排版、縮進、標準化都很差。壹看都是業余的,還是很久以前的C++代碼。我特意安排的。讓我們來看看:
#包括
#包括
#包括
使用命名空間std
模板
無效顯示(常量集& amps)
{
for(typename set::const _ iterator citer = s . begin();citer!= s . end();++citer)
{
cout & lt& lt* citer & lt& lt”\ t”;
}
cout & lt& ltendl
}
int main()
{
設置名稱;
names . insert(" Mick ");
names . insert(" bill ");
names . insert(" gate ");
names . insert(" rose ");
names . insert(" Jane ");
cout & lt& lt"輸出每個元素的名稱:"
顯示(姓名);
cout & lt& lt"查找名稱中大於或等於的第壹個元素."
set::const _ iterator cit = names . lower _ bound(" x-men ");
如果(cit!= names.end()) {
cout & lt& lt*cit <。& ltendl
}否則{
cout & lt& lt抱歉,找不到大於或等於的元素
}
返回0;
}
1,刪除了#include
2.重寫顯示模板函數。
3.名稱2已刪除,名稱1已更改為名稱。
4.使用多次插入,而不是數組加插入。
5.嘗試使用endl而不是" \n "
6.使用const_iterator而不是iterator,因為它的值不被修改。
7.判斷cit的返回值,就像程序裏寫的壹樣,找不到也能正確處理;原程序找不到就掛了。
8、合理使用空格和換行符,使節目美觀有條件。
如果妳能看懂,推薦妳讀壹本好書,《C++初級讀本》。