﻿<?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++博客-eXile 的专栏-随笔分类-STL/BOOST</title><link>http://www.cppblog.com/eXile/category/7025.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 28 Jan 2010 22:25:11 GMT</lastBuildDate><pubDate>Thu, 28 Jan 2010 22:25:11 GMT</pubDate><ttl>60</ttl><item><title>说说C++智能指针(2): 标准库中的智能指针</title><link>http://www.cppblog.com/eXile/archive/2009/11/16/101062.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Mon, 16 Nov 2009 05:57:00 GMT</pubDate><guid>http://www.cppblog.com/eXile/archive/2009/11/16/101062.html</guid><wfw:comment>http://www.cppblog.com/eXile/comments/101062.html</wfw:comment><comments>http://www.cppblog.com/eXile/archive/2009/11/16/101062.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/eXile/comments/commentRss/101062.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eXile/services/trackbacks/101062.html</trackback:ping><description><![CDATA[

<p><span style="FONT-FAMILY: courier new; FONT-SIZE: 12pt">&nbsp; <span style="FONT-FAMILY: Courier">使用智能指针是C++中常用的管理内存的方式。关于智能指针的设计，各路C++高手也是各展神通。<br><br>&nbsp; 在1994年. Greg Colvin向C++标准委员会提出了自己设计的智能指针：auto_ptr和counted_ptr。auto_ptr实现基本的RAII管理，不可复制；counted_ptr采用引用计数实现了一个可复制的智能指针。两者用于不同的场合。<br>&nbsp; 但是标准委员会最终只通过了auto_ptr，并且对auto_ptr加入了一个古怪的&#8220;所有权转移&#8221;语义。后来auto_ptr和counted_ptr进入了Boost C++ 库，改名为scoped_ptr和shared_ptr。<br>&nbsp;&nbsp;<br>&nbsp; std::auto_ptr只所以设计为可拷贝的，也许是出于以下考虑，比如下例函数：</span></span></p>
<font size="4">
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;f1(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ptr);<br></span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;f2();</span></div>
</font><p><font size="4">&nbsp; </font><span style="FONT-SIZE: 12pt">&nbsp;f1中的参数所指向的对象应该由谁来删除呢？调用者还是被调用者？如果不看程序文档的话，无法知道这一点。f2函数也存在同样的问题。<br><br>&nbsp;&nbsp; 用auto_ptr可以消除这种歧义性：</span></p>
<font size="4">
<div style="border-left-color: rgb(204, 204, 204); padding-bottom: 4px; background-color: rgb(238, 238, 238); padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; padding-top: 4px; "><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;f1(auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;ptr);<br>auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;f2();</span></div>
</font><p><font size="4">&nbsp;&nbsp;<br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="FONT-FAMILY: courier new">尽管如此，auto_ptr的&#8220;所有权转移&#8221;语义还是会带来副作用，因为会修改原值的常量拷贝违背了一般的设计原则，它也许会在你意想不到的情况下就把对象转移了。它也不能用于标准容器中。<br>&nbsp;&nbsp; 所以auto_ptr在新的标准库已经不再推荐使用。取而代之的是unique_ptr。unique_ptr与auto_ptr类似，但限制了auto_ptr的拷贝行为。同时，像上面举的例子一样，unique_ptr可以作为函数的参数和返回值使用。这是因为C++增加了一个新的特征：右值引用。<br><br>&nbsp;&nbsp; shared_ptr也进入了标准库。对于引用计数的智能指针而言，循环引用是一个大问题。标准库为此把shared_ptr定义为强引用指针，它还实现了一个弱引用指针weak_ptr。显然，标准库并没有从根本上解决循环引用的问题，它把这个问题交给了程序员。在一个简单的系统中，你可以区分使用shared_ptr和weak_ptr，以此来避免出现循环引用。但是在一个大的对象系统中，有时还是容易出错。循环引用的问题，严重减弱了shared_ptr的可用性。<br><br>&nbsp;&nbsp; 那么能不能自动检测是否出现循环引用呢？事实上，对于shared_ptr这种使用非侵入式策略实现的智能指针，是很难实现自动检测的。但是如果采用侵入式设计，我们可以引入一些接口，来解决这个问题。循环引用的检测，实际上是图论中的回路检测问题。<br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文由<a style="FONT-SIZE: 12pt" title="eXile" href="http://www.cppblog.com/eXile/">eXile</a><span style="FONT-SIZE: 12pt">&nbsp;原创，转载请表明原贴地址。&nbsp;</span><a href="http://www.cppblog.com/eXile/">http://www.cppblog.com/eXile/</a>。</p><img src ="http://www.cppblog.com/eXile/aggbug/101062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eXile/" target="_blank">eXile</a> 2009-11-16 13:57 <a href="http://www.cppblog.com/eXile/archive/2009/11/16/101062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::asio示例HTTP Server类图</title><link>http://www.cppblog.com/eXile/archive/2008/05/07/49072.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Tue, 06 May 2008 16:50:00 GMT</pubDate><guid>http://www.cppblog.com/eXile/archive/2008/05/07/49072.html</guid><wfw:comment>http://www.cppblog.com/eXile/comments/49072.html</wfw:comment><comments>http://www.cppblog.com/eXile/archive/2008/05/07/49072.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/eXile/comments/commentRss/49072.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eXile/services/trackbacks/49072.html</trackback:ping><description><![CDATA[<p><a href="http://www.cppblog.com/images/cppblog_com/exile/asio_http_1.jpg"><img height=652 alt="" src="http://www.cppblog.com/images/cppblog_com/exile/asio_http_1.jpg" width=878 align=left border=0></a><a href="http://www.cppblog.com/images/cppblog_com/exile/asio_http_1.jpg"></a></p>
<img src ="http://www.cppblog.com/eXile/aggbug/49072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eXile/" target="_blank">eXile</a> 2008-05-07 00:50 <a href="http://www.cppblog.com/eXile/archive/2008/05/07/49072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vector的有序化操作</title><link>http://www.cppblog.com/eXile/archive/2008/01/29/42104.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Tue, 29 Jan 2008 05:13:00 GMT</pubDate><guid>http://www.cppblog.com/eXile/archive/2008/01/29/42104.html</guid><wfw:comment>http://www.cppblog.com/eXile/comments/42104.html</wfw:comment><comments>http://www.cppblog.com/eXile/archive/2008/01/29/42104.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/eXile/comments/commentRss/42104.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eXile/services/trackbacks/42104.html</trackback:ping><description><![CDATA[　　在有些情况下，需要用到一个有序的vector。它的有序操作有三种：查找，插入，删除。<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&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Container</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;void&nbsp;ordered_insert(Container</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;c,　&nbsp;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Container::value_type&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;t)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c.insert(std::upper_bound(c.begin(),&nbsp;c.end(),&nbsp;t),&nbsp;t);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Container,&nbsp;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Cmp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;void&nbsp;ordered_insert(Container</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;c,　</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Container::value_type&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;t,　Cmp&nbsp;cmp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c.insert(std::upper_bound(c.begin(),&nbsp;c.end(),&nbsp;t,&nbsp;cmp),&nbsp;t);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
　　<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&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Container,&nbsp;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;It</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;void&nbsp;erase_range(Container</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;c,&nbsp;std::pair</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">It,&nbsp;It</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;r)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c.erase(r.first,&nbsp;r.second);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Container</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;void&nbsp;ordered_erase(Container</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;c,&nbsp;　</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Container::value_type&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;t)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;erase_range(c,&nbsp;std::equal_range(c.begin(),&nbsp;c.end(),&nbsp;t));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Container,&nbsp;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;T,&nbsp;</span><span style="COLOR: #0000ff">typename</span><span style="COLOR: #000000">&nbsp;Cmp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>inline&nbsp;void&nbsp;ordered_erase(Container</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;c,&nbsp;T&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;t,&nbsp;Cmp&nbsp;cmp)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;erase_range(c,&nbsp;std::equal_range(c.begin(),&nbsp;c.end(),&nbsp;t,&nbsp;cmp));<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>　　查找可通过binary_search, lower_bound, upper_bound, 或者equal_range实现。如果要实现类似map的关键字搜索，有一个技巧，就是用比较函数进行重载，比如学生要按学号查找，则用以下定义：<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">struct&nbsp;Student<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;name;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;LessThan<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;operator()&nbsp;(Student&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;x,&nbsp;Student&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;y)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x.id&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;y.id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;operator()&nbsp;(Student&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;x.id&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;operator()&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;id,&nbsp;Student&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;y)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;id&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;y.id;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>查找学号为5的学生：<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">std::vector&lt;Student&gt; students;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><span style="COLOR: #000000">bool&nbsp;exist&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;std::binary_search(students.begin(),&nbsp;students.end(),&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;Student::LessThan());</span></div>
<br>删除学号为5的学生：<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">ordered_erase(students,&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;Student::LessThan());</span></div>
<br>
<img src ="http://www.cppblog.com/eXile/aggbug/42104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eXile/" target="_blank">eXile</a> 2008-01-29 13:13 <a href="http://www.cppblog.com/eXile/archive/2008/01/29/42104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>悬挂指针与boost::weak_ptr</title><link>http://www.cppblog.com/eXile/archive/2007/10/11/33936.html</link><dc:creator>eXile</dc:creator><author>eXile</author><pubDate>Thu, 11 Oct 2007 03:49:00 GMT</pubDate><guid>http://www.cppblog.com/eXile/archive/2007/10/11/33936.html</guid><wfw:comment>http://www.cppblog.com/eXile/comments/33936.html</wfw:comment><comments>http://www.cppblog.com/eXile/archive/2007/10/11/33936.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/eXile/comments/commentRss/33936.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/eXile/services/trackbacks/33936.html</trackback:ping><description><![CDATA[<p>&nbsp;　　与内存泄露相比，C++最令人头痛的问题是内存越界，而内存越界很多情况下是由于悬挂指针引起的。　　<br>　　假设一个指针变量： <br>　　Object * ptr;<br>　　使用ptr时，我们除了要判断ptr是否为0以外，还要怀疑它指向的对象是否有效，是不是已经在别的地方被销毁了。我们希望当它指向的对象被销毁时，ptr被自动置为0。<br>　　显然，C++没有这种机制，但是，可以借助于boost::weak_ptr做到这一点。<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">inline&nbsp;void&nbsp;null_deleter(void&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>class&nbsp;X<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;shared_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">X</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;this_;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i_;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">explicit</span><span style="COLOR: #000000">&nbsp;X(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i):&nbsp;this_(this,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">null_deleter),&nbsp;i_(i)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;X(X&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;rhs):&nbsp;this_(this,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">null_deleter),&nbsp;i_(rhs.i_)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;operator</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(X&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;rhs)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;rhs.i_;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;weak_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">X</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;weak_this()&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;{&nbsp;return&nbsp;this_;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>};<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br>&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>定义变量：<br>weak_ptr&lt;X&gt; ptr = x.weak_this();&nbsp; // x为一个X&nbsp;对象&nbsp;<br><br>则当 x 被销毁时，ptr 被自动置为无效。使用方法如下：<br><br>if ( shard_ptr&lt;X&gt;&nbsp; safePtr&nbsp; = ptr.lock() )&nbsp; safePtr-&gt;do_something();<br><br>这种办法用于单线程中，因为 x&nbsp;&nbsp;对象可能是基于栈分配的。如果需要在多线程中访问X对象，那么最好的办法还是使用shared_ptr 来管理对象的生命期。这样的话，对于safePtr, 可以保证在 safePtr 的生命期内，它所指向的对象不会被其它线程删除。<br>
<img src ="http://www.cppblog.com/eXile/aggbug/33936.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/eXile/" target="_blank">eXile</a> 2007-10-11 11:49 <a href="http://www.cppblog.com/eXile/archive/2007/10/11/33936.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>