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代码的注释有两种。