﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-silekey-文章分类-STL</title><link>http://www.cppblog.com/silekey/category/9020.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 02 Dec 2008 12:49:59 GMT</lastBuildDate><pubDate>Tue, 02 Dec 2008 12:49:59 GMT</pubDate><ttl>60</ttl><item><title>函数返回值中的一点小技巧</title><link>http://www.cppblog.com/silekey/articles/68356.html</link><dc:creator>鹿哥</dc:creator><author>鹿哥</author><pubDate>Tue, 02 Dec 2008 03:13:00 GMT</pubDate><guid>http://www.cppblog.com/silekey/articles/68356.html</guid><wfw:comment>http://www.cppblog.com/silekey/comments/68356.html</wfw:comment><comments>http://www.cppblog.com/silekey/articles/68356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/silekey/comments/commentRss/68356.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/silekey/services/trackbacks/68356.html</trackback:ping><description><![CDATA[<p>先看看stl 容器set 里面的返回值是怎么弄的.<br>&nbsp;最近才搞明白为什么set的insert方法真正的用法,简单得连例子都没有.<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">注意哦,set&nbsp;里面的值是不会重复的,也就是说,当在set容器里再插入一个已有的值是没有效果的。</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::_Pairib&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.insert(</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.insert(&nbsp;</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这句注释的话,就打印&nbsp;new&nbsp;value&nbsp;is&nbsp;30</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;result.second&nbsp;)<br><img id=Codehighlighter1_178_244_Open_Image onclick="this.style.display='none'; Codehighlighter1_178_244_Open_Text.style.display='none'; Codehighlighter1_178_244_Closed_Image.style.display='inline'; Codehighlighter1_178_244_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_178_244_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_178_244_Closed_Text.style.display='none'; Codehighlighter1_178_244_Open_Image.style.display='inline'; Codehighlighter1_178_244_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_178_244_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_178_244_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">成功插入</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">new&nbsp;value&nbsp;is%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">result.first&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_253_311_Open_Image onclick="this.style.display='none'; Codehighlighter1_253_311_Open_Text.style.display='none'; Codehighlighter1_253_311_Closed_Image.style.display='inline'; Codehighlighter1_253_311_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_253_311_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_253_311_Closed_Text.style.display='none'; Codehighlighter1_253_311_Open_Image.style.display='inline'; Codehighlighter1_253_311_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_253_311_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_253_311_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">old&nbsp;value&nbsp;is!%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">result.first&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p>&nbsp;<br>光看源代码,是什么意思,我那时还真是一下子想不明白.</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">typedef&nbsp;pair</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iterator,&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;_Pairib;</span></div>
<p>如果不是以前看过一本书,讲述如何返回错误值的技巧,以及一大堆背后的考量还真难说.(说了一大堆,比如用异常啦,或者把返回值放在函数参数中啦)<br><br><br>最早使用set时候 只知道返回两个类型,却不明白为什么,还在心理骂过作者,为什么insert没有直接返回iterator?<br>那个时候也看到Pairib里有个iterator,没有搞明白为什么它会在first里而不在second里,最后项目紧,为了安全,就写成了这样.<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">s.insert(</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterator&nbsp;itor&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;s.find(</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">);</span></div>
<br><br>我想问题的根本原因是名称引起的吧,如果返回值类型是下面这样写的话,估计当时的我也能看得懂吧:<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;typename&nbsp;RET_VALUE,&nbsp;typename&nbsp;ERR_CODE&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;RET_TEMPLATE<br><img id=Codehighlighter1_70_110_Open_Image onclick="this.style.display='none'; Codehighlighter1_70_110_Open_Text.style.display='none'; Codehighlighter1_70_110_Closed_Image.style.display='inline'; Codehighlighter1_70_110_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_70_110_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_110_Closed_Text.style.display='none'; Codehighlighter1_70_110_Open_Image.style.display='inline'; Codehighlighter1_70_110_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_70_110_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_70_110_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;RET_VALUE&nbsp;result;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;ERR_CODE&nbsp;&nbsp;err;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;RET_TEMPLATE</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;iterator,&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;itor_ret_b;</span></div>
<br>但是为什么他们没有这样做呢?我想应该是当时有现成的pair模板,而为了代码重用的考量吧.<br>所以RET_TEMPLATE可以不用再写。然而即使是这样,我还是坚持其返回值应该用类似这样的名称 itor_ret_b (有些人水平高了,就容易忽视初学者 @_@ )<br><br>话说回来，如果返回值使用这种方式，把错误代码与真正的返回值数据绑定在一起,还真方便哪.<br>因为这样的话,就可以直接用if判断,也可以直接把返回值做为其它函数的参数传进去了.<br><br>就好象用指针可以使用是否为 NULL&nbsp; 来判断其返回值的有效性那么方便.<br>对哦,iterator也可以返回end的啊,这样不就表明已存在了吗?当时我可能也是这么想的吧.<br>不过细想一下,也许在已存在一个值的情况下,有人还想要那个值是在哪个位置吧.<br>毕竟再做一次find真的很影响效率耶.<br>
<img src ="http://www.cppblog.com/silekey/aggbug/68356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/silekey/" target="_blank">鹿哥</a> 2008-12-02 11:13 <a href="http://www.cppblog.com/silekey/articles/68356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>