A. error C2679: 二進制「>>」: 沒有找到接受「const char [5]」類型的右操作數的運算符(或沒有可接受的轉換)
我用VS2008、VS2010、VS2013、GCC都試了一下,確實VS2008、VS2010編譯出錯,但是VS2013編譯成功了(我也很納悶為什麼成功,從標准庫給出的原型來看程序應該是不能編譯通過的)!
你把typedef set::const_iterator CIT;改成typedef set::const_iterator CIT;就可以編譯通過了!
你的問題是說完了,但我還有話說,如果你那本書上真是這樣的代碼,那你可以把那本書直接扔掉了,完全不值得看,誤人子弟,害人害己,當然,我告訴你原因:
原罪一:
set模板類定義的原型是
template < class T, // set::key_type/value_type
class Compare = less, // set::key_compare/value_compare
class Alloc = allocator // set::allocator_type
> class set;
這里第一個參數就是你要存儲的數據的類型,第二個參數和第三個是可選的,鍵彎第二個默認是less,排序准則,是一種函數對象(重載了括弧運算符的)其定義如下:
template struct less : binary_function {
bool operator() (const T& x, const T& y) const {return x<y;}
};
也就是說less表示使用string的小於號作為排序准則(可以換成greater就是按大於號排序);第三個就不說了!
所以typedef set::const_iterator CIT;這個東西嚴格意義來說是不正確的,你跟搞不清楚它要做什麼,string作為排序准則,究竟是大於號?小於號?我剛查了下string沒有重載operator (),所以不算函數對象;但是VS2013和G++能編譯通過,我很納悶!
原罪二:
來看看這個模板函數的定義,這明顯不是面向對象的思想,是面向過程(C語言)的思維方式
template
void show(CIT&it,set&s)
{
for(it=s.begin();it!=s.end();++it)
{
cout<<*it<<"\t";
}
cout<<endl;
}
C++的做法是什麼呢
template
void show(const set& s)
{
for (typename set::const_iterator citer = s.begin(); citer != s.end(); ++citer)
{
cout << *citer << "\t";
}
cout << endl;
}
我來解釋一下,這個函數的作用就是輸出set容器內的每一個元素稿猜悶。明明只需要傳入一個參數的,為什麼會有兩個?太奇怪了。
原罪三:(這部分可以商議)
再看這一段奇葩代碼
const int N=5;
string s1[N]={"mick","bill","兆棚gate","rose","jane"};
string s2[N]={"張峰","秦平","李力","陸放","胡濤"};
setname1;
name1.insert(s1,s1+N);
setname2(s2,s2+N);
首先這里定義了兩個臨時數組,s1,s2,從這里看是為了使用數組特有的初始化列表(C++11標准後set也支持了),但從這個例子里看不出來這樣使用的好處!
而且name1和name2的構造方式還不一樣(第一個使用默認構造函數+insert成員函數,第二個則使用了特定的構造函數),很明顯現在這個程序里不好解釋
更合適的做法是:
set name1;
name1.insert("mick");
name1.insert("bill");
name1.insert("gate");
name1.insert("rose");
name1.insert("jane");
set name2;
name2.insert("張峰");
name2.insert("秦平");
name2.insert("李力");
name2.insert("陸放");
name2.insert("胡濤");
很一目瞭然,那麼有些人可能會說如果元素很多呢,這樣的代碼會很難看,那麼你其實應該將這些字元串放入文件,然後由程序讀入,並使用insert插入到set中
原罪四:
cout<<"查找name2中大於「李力」的第一個元素。\n";
cit=name2.upper_bound("李力");
cout<<*cit<<endl;
set在英文下是按照字典順序排序的,漢字的話,則不很確定,比如我在linux下使用G++運行的結果就是:
查找name2中大於的第一個元素。
秦平
注釋:name2中順序是:張峰 李力 秦平 胡濤 陸放(非拼音順序)
而在windows下使用VS運行的結果則是:
查找name2中大於的第一個元素。
陸放(按照的是拼音順序)
所以,這里就根本不該使用漢字來舉例子,使用英文單詞就會沒有任何異議!
原罪五:
整個程序的布局、縮進、規范化都很差,一看都是業余的,或者很早以前的C++代碼,我特別做了整理,看下:
#include
#include
#include
using namespace std;
template
void show(const set& s)
{
for (typename set::const_iterator citer = s.begin(); citer != s.end(); ++citer)
{
cout << *citer << "\t";
}
cout << endl;
}
int main()
{
set names;
names.insert("mick");
names.insert("bill");
names.insert("gate");
names.insert("rose");
names.insert("jane");
cout << "輸出names中各個元素:" << endl;
show(names);
cout << "查找names中大於或等於的第一個元素." << endl;
set::const_iterator cit = names.lower_bound("x-men");
if (cit != names.end()) {
cout << *cit << endl;
} else {
cout << "很抱歉, 沒有沒有找到大於或等於的元素" << endl;
}
return 0;
}
1、去掉了#include
2、重寫了show模板函數
3、去掉了name2,將name1改為names
4、使用多次insert代替數組加insert
5、盡量使用endl而非"\n"
6、使用const_iterator而非iterator,因為不修改其值
7、對cit的返回值做了判斷,就想程序里寫的,找不到的時候能夠正確的處理;原來的程序在找不到的情況下,就會掛掉
8、合理的使用空格和換行,讓程序美觀而有調理
如果你看得進去,那我推薦你一本好的書《C++ Primer》看看吧
B. 怎麼給代碼加註釋
在進仿桐行程序調試時,可能需要注釋掉大片的程序代碼,以縮小Bug出現的范圍,從而盡快鎖定錯誤原因。那麼使用Eclipse如何快速注釋程序代碼呢?下面就講解3種常用方法。
法一:使用Ctrl+/快捷鍵
第1步:在Eclipse中拖動滑鼠,選中需要注釋的代碼,通常為連續多行代碼。
第2步:按住Ctrl+/快捷鍵
第3步:會發現所選代碼被「//」注釋掉。當調試完後,可再次按住Ctrl+/快激閉捷鍵打開注釋。
方法二:使用Ctrl+Shift+C快捷鍵
第1步:在Eclipse中拖動滑鼠,選中需要注釋的代碼。
第2步:按住Ctrl+Shift+C快捷鍵
第3步:會發現所選代碼被「//」注釋掉。當調試完後,可再次按住Ctrl+Shift+C快捷鍵打開注釋。
方法三:使用Ctrl+Shift+/快捷鍵
第明大裂1步:在Eclipse中拖動滑鼠,選中需要注釋的代碼。
第2步:按住Ctrl+Shift+/快捷鍵。
第3步:會發現所選代碼被「/*
*/」注釋掉。
第4步:當調試完後,可按住Ctrl+Shift+\快捷鍵打開注釋。
C. 你見過哪些奇趣的代碼注釋
我說一個注釋能起作用的。通過添加註釋,躲過安全軟體的檢查。大概在07年前後,SQL注入還比較常見,許多小網站用asp,學習了一些基本的攻防技術,也是在那個時候聽說了 @餘弦等巨巨。滲透的話肯定要用到asp木馬,海陽什麼的。asp這個東西功能全靠ActiveX,具體來講,比如Set wsh = server.CreateObject("wscript.shell")而當時基本上小網站都是虛擬主機,擁有的許可權也不過是傳上去自己的asp腳本而已。當時怎麼檢查是否被留下木馬了呢?清嘩主要就是去搜是否調用了這種比較危險的ActiveX(直接用正則匹配)。其中一個好像是叫雷客圖(其實主要是用來黑吃黑,找出別人留下的後門)。當然,asp木馬為了避免被檢查出來,會把敏感的組件名拼接起來。Set wsh = server.CreateObject("wscri"+"pt.shell")或者包一個函數Function CreateObj(str)Set CreateObj = server.CreateObject(str)End Function不過,查殺的人又不傻,直接把這兩種情況都當作危險行為了。(出現字元串拼接,或者塵拍括弧裡面的是變數而沒有引號)好,交代完背景,可以說那個有趣的注釋了。當時我只加了一行注釋就成功的躲過了檢查,FunctionCreateObj(str)Set CreateObj = server.CreateObject(str) '"""")End Function因為當時所有的檢查代碼,正則表達式都沒有設置模式,而VBS默認的是貪婪模式。所以用注釋里的括弧閉合前面的括弧,然後把引號放在兩個括弧中間。這樣就繞過派正羨了檢查。現在想想挺弱的,不過高中時候發現自己除了會做幾道物理題以外還能想出這種奇技淫巧還是挺得意的。
D. 怎麼給代碼加註釋
C/C++/C#
行注釋://這里是注釋
塊注釋:/*這里是注釋*/
Java
行注釋://這里是注釋
塊注釋:/*這里是注釋*/
HTML
塊注釋:<!--這里是注釋-->
CSS
塊注釋:/*這里是注釋*/
JavaScript
行注釋://這里是注釋
塊注釋:/*這里是注釋*/
XML
塊注釋:<!--這里是注釋-->
Python
行注釋:#這里是注釋
塊注釋:'''這里是注釋'''
SQL Server/Oracle PLSQL
行注釋:--這里是注釋
塊注釋:/*這里是注釋*/
MySQL
行注釋:--這里是注釋
行注釋:#這里是注釋
塊注釋:/*這里是注釋*/
VB
行注釋:'這里是注釋
匯編語言
行注釋:;這里是注釋
perl
行注釋:# 這是一個單行注釋
塊注釋:
=pod
這里是注釋
=cut
Matlab
行注釋:%這里是注釋
塊注釋:%%這里是注釋%%
塊注釋:%{這里是注釋%}
R語言
行注釋:#這里是注釋
塊注釋:if(false){這里是注釋}
(4)奇葩代碼注釋擴展閱讀:
關於高級語言中的注釋:
1、注釋是代碼的「提示」或「解釋」而非文檔;注釋主要用於解釋代碼復雜度;注釋應准確、易懂(無二義性)、簡潔;程序中有效注釋量必須在20%以上。
說明:代碼清楚可以自注釋的不需加註釋,過分詳細的注釋容易使人厭煩,切記不要自以為高深讓別人看不懂而不加註釋。
2、注釋的目的:為了便於代碼的維護、解釋代碼的功能和方法等方便讀者閱讀,以及防止不必要的重復信息。
3、給代碼添加註釋絕對是好習慣,最好邊寫代碼邊注釋
E. 如何用代碼生成這種有意思的注釋圖案
可通過如洞胡老下三種方法自動添加註釋: (1)輸入「/**」納升做胡並回車。 (2)用快捷鍵 Alt+Shift+J(先選中某個方法、類名或變數名)。 (3)在右鍵菜單中選擇「Source > Generate ElementComment」。
F. python代碼的注釋有幾種
python代碼的注釋有兩種。