免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: lipingtababa
打印 上一主题 下一主题

[C++] 你们的代码会用引用吗? [复制链接]

论坛徽章:
0
171 [报告]
发表于 2008-12-26 09:37 |只看该作者
虽然刚来CU不久,不过还是最喜欢flw回帖的风格。对于此类讨论的问题,本来就是仁者见仁 智者见智  喜欢就用  不喜欢就不用的问题,最后闹的还会因为某些原因伤了和气,把帖子的本意都毁坏了。小弟的一点拙见。

论坛徽章:
0
172 [报告]
发表于 2008-12-26 09:54 |只看该作者
在自然界中,任何物体都有地址。在C语言中,知道了*代表地址,就很容易联想到:**代表地址的地址,***代表地址的地址的地址,...这是多么自然的事情。但是!C++的引用能让你联想到什么?你什么也联想不到!因为C++的引用根本就是没有内容的东西!思维是物质运动的结果,没有物质也就没有思维,所以不会从没有内容的东西想到什么。


赞同,C++的运算符重载是个得不偿失的东西!程序员都可在自己设计的类中按自己的想法给运算符号添加新概念,就像让自然语言允许每个人随便造字造词,怎么能很好交流呢?


那些访问控制符private、protected、public也是些垃圾东西!常理讲,类的数据成员应该都为私有,但C++还允许你把它们定义为公有向外公开,这就是C++在告诉你:这样做是错误的,但你可以这样做。你看,C++是多么犯贱呀。


还有try-catch,throw、try-catch、引用、运算符重载、访问控制符(private、protected、public)都是C++制造的没有一点回收价值的垃圾!

论坛徽章:
0
173 [报告]
发表于 2008-12-26 10:07 |只看该作者
帖子都这么长了

我前些日子碰到的关于引用的问题.

现有vector<string> reports;
要把它打包发出去,但是一次打包最多只能发5000个reports.

如果打包函数是 void pack(constant vector<string>& packeds);
那么调用代码应该是这样
vector<string> packed;
if(reports.size()<=5000)
&nbsp;&nbsp;&nbsp;&nbsp;packed.assign(reports);
else
&nbsp;&nbsp;&nbsp;&nbsp;packed.assign(reports.begin(),reports.begin()+5000);
pack(packed);

这个做法的缺陷是不论reports的大小是否大于5000,都得拷贝一份.

如果打包函数接受指针,void pack(constant vector<string>* packeds);
调用代码可以这么写

vector<string> *p;
vector<string> packed;
if(reports.size()<=5000)
{
&nbsp;&nbsp;&nbsp;&nbsp;p=&reported;
}
else
{
&nbsp;&nbsp;&nbsp;&nbsp;packed.assign(reports.begin(),reports.begin()+5000);
&nbsp;&nbsp;&nbsp;&nbsp;p=&packed;
}
pack(p);


这样可以避免无谓的拷贝.

但是考虑到vector<string> *p;的代码太怪异了,我放弃了后一种写法.

[ 本帖最后由 lipingtababa 于 2008-12-26 11:23 编辑 ]

论坛徽章:
0
174 [报告]
发表于 2008-12-26 10:22 |只看该作者
原帖由 happynp 于 2008-12-26 09:04 发表
你写下C++的重载operator<<试下, 就知道引用不能被指针取代了

ostream& operator<<(ostream& os,const Point& pt)
{
        os<<"("<<pt.y<<","<<pt.x<<")\t";
        return os;
}


你的逻辑是:垃圾A需要垃圾B,所以垃圾B存在是必须的。
C++的运算符重载就是垃圾A!
你觉得你的逻辑逻辑么?

论坛徽章:
0
175 [报告]
发表于 2008-12-26 10:28 |只看该作者
送给C++程序员的一句话:当你感觉做某件事别扭时,如果在原地找不到原因,就往回走,看看前面是不是有狗东西逼你这样做了。

[ 本帖最后由 xyk6 于 2008-12-27 10:33 编辑 ]

论坛徽章:
0
176 [报告]
发表于 2008-12-26 11:08 |只看该作者
原帖由 lipingtababa 于 2008-12-26 10:07 发表

如果打包函数接受指针,void pack(constant vector<string>* packeds);
调用代码可以这么写
vector<string> *p;
vector<string> packed;
if(reports.size()<=5000)
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=&reported;
}
else
{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packed.assign(reports.begin(),reports.begin()+5000);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=&packed;
}
pack(p);


这样可以避免无谓的拷贝.



既然你可以这么做 , 下面的程序:

原帖由 lipingtababa 于 2008-12-26 10:07 发表
如果打包函数是 void pack(constant vector<string>& packeds);
那么调用代码应该是这样
vector<string> packed;
if(reports.size()<=5000)
&nbsp;&nbsp;&nbsp;&nbsp;packed.assign(reports);
else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packed.assign(reports.begin(),reports.begin()+5000);
pack(packed);


这个做法的缺陷是不论reports的大小是否大于5000,都得拷贝一份.


就你的逻辑,写成:
vector<string> packed;
if(reports.size()<=5000)
&nbsp;&nbsp;&nbsp;&nbsp;pack(reports);
else {         packed.assign(reports.begin(),reports.begin()+5000);
&nbsp;&nbsp;&nbsp;pack(packed);
}


不行吗 ? 为什么“都得拷贝一份”?

论坛徽章:
0
177 [报告]
发表于 2008-12-26 11:21 |只看该作者
我也想过两次分别调用pack,但是这样做,我觉得代码逻辑不清晰,可读性比较差.

假设,以后在调用pack()之前需要先调用sort(),decorate(),这些代码都得拷贝两分.

vector<string> packed;
if(reports.size()<=5000)
    sort(reports);
    decorate(reports);   
    pack(reports);
else {         
    packed.assign(reports.begin(),reports.begin()+5000);
    sort(packed);
    decorate(packed);   
   pack(packed);
}

论坛徽章:
0
178 [报告]
发表于 2008-12-26 11:37 |只看该作者
原帖由 lipingtababa 于 2008-12-26 11:21 发表

vector<string> packed;
if(reports.size()<=5000)
&nbsp;&nbsp;&nbsp;&nbsp;sort(reports);
&nbsp;&nbsp;&nbsp;&nbsp;decorate(reports);   
&nbsp;&nbsp;&nbsp;&nbsp;pack(reports);
else {         
&nbsp;&nbsp;&nbsp;&nbsp;packed.assign(reports.begin(),reports.begin()+5000);
&nbsp;&nbsp;&nbsp;&nbsp;sort(reports);
&nbsp;&nbsp;&nbsp;&nbsp;decorate(reports);   
&nbsp;&nbsp;&nbsp;pack(packed);
}


写成下面这样不行吗 ?
vector<string> packed;

&nbsp;&nbsp;&nbsp;&nbsp;sort(reports);
&nbsp;&nbsp;&nbsp;&nbsp;decorate(reports);   

if(reports.size()<=5000)
&nbsp;&nbsp;&nbsp;&nbsp;pack(reports);
else {              
packed.assign(reports.begin(),reports.begin()+5000);
&nbsp;&nbsp;&nbsp;pack(packed);
}


还是不行 ? 下面这样呢?
vector<string> packed;
if(reports.size()<=5000)
&nbsp;&nbsp;&nbsp;&nbsp;my_pack(reports);
else {         
&nbsp;&nbsp;&nbsp;&nbsp;packed.assign(reports.begin(),reports.begin()+5000);
&nbsp;&nbsp;&nbsp;my_pack(packed);
}

my_pack ( ... )
{
&nbsp;&nbsp;&nbsp;&nbsp;sort(reports);
&nbsp;&nbsp;&nbsp;&nbsp;decorate(reports);   
&nbsp;&nbsp;&nbsp;pack (reports)
}

论坛徽章:
0
179 [报告]
发表于 2008-12-26 11:40 |只看该作者
第一种肯定不行,完全不一样的逻辑.应该是先取子集再sort,这样改就成先sort再取子集了.

第二种办法,确实可以解决我提出的问题,我再想想

论坛徽章:
0
180 [报告]
发表于 2008-12-26 11:48 |只看该作者
bbjmmj?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP