这段代码中有个地方很是不解,望指点

为轮子而生 2010-05-09 08:12:44
#include<iostream>
#include<vector>
#include<string>
using namespace std;

struct Pair
{
string name;
double val;
};

vector<Pair> pairs;

double& value(const string& s)
{
for(int i=0; i<pairs.size(); i++)
{
if(s==pairs[i].name)
{
return pairs[i].val; //既然要自加1,为什么一定要返回一个值呢? 而我写成return 0 后,又会报错,为什么?
}
}
Pair p;
p.name =s;
p.val =0;
pairs.push_back(p);
return pairs[pairs.size()-1].val;
}

int main()
{
string buf;
while(cin>>buf&&buf!="#") value(buf)++;
for(vector<Pair>::const_iterator p=pairs.begin(); p!=pairs.end(); ++p)
cout<<p->name<<":"<<p->val<<'\n';

return 0;
}
...全文
120 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
nima01 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rocmemory 的回复:]
这里的double& value(const string& s) 为什么s要用const呢?
[/Quote]
表明s是一个输入参数,不能更改
为轮子而生 2010-05-10
  • 打赏
  • 举报
回复
这里的double& value(const string& s) 为什么s要用const呢?
akonlbjrd 2010-05-10
  • 打赏
  • 举报
回复
加&的原因是因为不想函数修改实参的值。。。
delphiboy_lwb 2010-05-10
  • 打赏
  • 举报
回复
建议在使用const时不要用&,这不是个好习惯
Value函数返回为引用,而Value()若想实现自加操作,则需要实际地址,引用是在实际变量上进行的.

即引用是对变量的操作,没有变量如何引用?
pengzhixi 2010-05-10
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 rocmemory 的回复:]
这里的double& value(const string& s) 为什么s要用const呢?
[/Quote]
只要该函数不修改实参值就最好用const来限制
为轮子而生 2010-05-10
  • 打赏
  • 举报
回复
但是,如果不使用&来引用,不就无法更改了么,为什么既使用&,又要用const呢
tiantangniao232 2010-05-09
  • 打赏
  • 举报
回复
补充一下
引用可以用0初始化,不过必须是const修饰
const double &rd = 0.0
tiantangniao232 2010-05-09
  • 打赏
  • 举报
回复
程序功能是统计输入字符串分别出现的次数
#include<iostream>
#include<vector>
#include<string>
using namespace std;

struct Pair
{
string name;
double val;
};

vector<Pair> pairs;

double& value(const string& s)
{
for(int i=0; i<pairs.size(); i++)
{
if(s==pairs[i].name)
{
return pairs[i].val; //既然要自加1,为什么一定要返回一个值呢? 而我写成return 0 后,又会报错,为什么?
//因为返回值是个引用所以这里不能返回0,况且这里返回0也不对啊
}
}
Pair p;
p.name =s;
p.val =0;
pairs.push_back(p);
return pairs[pairs.size()-1].val;
}

int main()
{
string buf;
while(cin>>buf&&buf!="#") value(buf)++;//因为返回值是个引用可以作为左值,因此这里可以用++
for(vector<Pair>::const_iterator p=pairs.begin(); p!=pairs.end(); ++p)
cout<<p->name<<":"<<p->val<<'\n';

return 0;
}
windsting 2010-05-09
  • 打赏
  • 举报
回复
首先看函数 value 的返回值类型:
double&

说明返回一个double类型的引用,这样就可以让value的调用者对被引用的值进行修改,
也就是这一句:
value(buf)++;


之所以这么做是为了程序代码写起来方便,如果一个name==buf的对象存在,
就直接得到了它的value,如果不存在,那么它现在存在了,并且value设置为合理的0。

其实看程序,直接在value里面进行增1也没问题。

至于为什么你返回0有问题,就是因为,引用必须指向一个可寻址的对象,而你的常量0是不能寻址的。
说来话就长了,你可以试着写成自己觉得应该是的样子,可能就知道人家为什么这么写了。
GingerJWS 2010-05-09
  • 打赏
  • 举报
回复
value()返回的是一个引用,需要一个double实体。
0只是一个立即数,都不是一个double实体

另:代码挺漂亮
jixingzhong 2010-05-09
  • 打赏
  • 举报
回复
double& value(const string& s)

应该是根据名称s取得对应的值的,所以在匹配上的时候,也就是if(s==pairs[i].name)
则返回当前的值,所以return pairs[i].val;

如果要直接返回,注意一下类型,应该是return 0.0;
jixingzhong 2010-05-09
  • 打赏
  • 举报
回复
+1是为了遍历下一个元素

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧