﻿<?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++博客-shootingstars-随笔分类-C++</title><link>http://www.cppblog.com/shootingstars/category/4490.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 22 May 2008 21:10:02 GMT</lastBuildDate><pubDate>Thu, 22 May 2008 21:10:02 GMT</pubDate><ttl>60</ttl><item><title>[导入]C++中关于类中常数静态成员初始化的问题</title><link>http://www.cppblog.com/shootingstars/archive/2007/07/31/29071.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Tue, 31 Jul 2007 05:17:00 GMT</pubDate><guid>http://www.cppblog.com/shootingstars/archive/2007/07/31/29071.html</guid><wfw:comment>http://www.cppblog.com/shootingstars/comments/29071.html</wfw:comment><comments>http://www.cppblog.com/shootingstars/archive/2007/07/31/29071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shootingstars/comments/commentRss/29071.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shootingstars/services/trackbacks/29071.html</trackback:ping><description><![CDATA[class mytestclass <br>{ <br>public: <br>&nbsp;&nbsp;&nbsp; const static int i = 5; <br>}; <br>int main() <br>{ <br>&nbsp;&nbsp;&nbsp; std::cout&lt;&lt;mytestclass::i&lt;&lt;std::endl; <br>&nbsp;&nbsp;&nbsp; return 0; <br>} <br>结果没有问题，输出为5（编译器为vc7.1）
<p>但是在下面这个例子中： <br>int regi() <br>{ <br>&nbsp;&nbsp;&nbsp; return 5; <br>} <br>class mytestclass <br>{ <br>public: <br>&nbsp;&nbsp;&nbsp; const static int i = regi(); <br>}; <br>int main() <br>{ <br>&nbsp;&nbsp;&nbsp; std::cout&lt;&lt;mytestclass::i&lt;&lt;std::endl; <br>&nbsp;&nbsp;&nbsp; return 0; <br>} <br>输出却不正确，输出为0（编译链接都没有问题）。。。 <br>似乎代码并没有执行regi函数？ <br><br>在C++标准中将初始化变量分为"动态初始化"和"静态初始化","动态初始化"为利用函数进行初始化,"静态初始化"为常量表达式进行初始化. <br>C++标准对于类中的常量表达式的"动态初始化"似乎并未做说明,所以是否支持类中常数静态变量的动态初始化也就取决与编译器的设计了. <br>但是无论如何vc7.1的编译结果都是不对的,它并没有给出错误,但是结果与逻辑不向符合,这应该是vc7.1的一个bug.(在vs2005中的C++编译器已经修正了这个bug,给出了一个编译Error) <br><br>详细讨论请见: <br><a href="http://community.csdn.net/Expert/topic/4432/4432789.xml?temp=.3202783">http://community.csdn.net/Expert/topic/4432/4432789.xml?temp=.3202783</a> <br><br>特别感谢qfeng_zhao 、 lxpws 、 iGray 等几位. </p>
<img src="http://www.cnblogs.com/shootingstars/aggbug/321956.html" height="1" width="1"><br><br>
<div align="right"><a style="text-decoration: none;" href="http://shootingstars.cnblogs.com/" target="_blank">shootingstars</a> 2006-01-23 11:46 <a href="http://www.cnblogs.com/shootingstars/archive/2006/01/23/321956.html#Feedback" target="_blank" style="text-decoration: none;">发表评论</a></div>
<br>文章来源:<a href="http://www.cnblogs.com/shootingstars/archive/2006/01/23/321956.html">http://www.cnblogs.com/shootingstars/archive/2006/01/23/321956.html</a> <img src ="http://www.cppblog.com/shootingstars/aggbug/29071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shootingstars/" target="_blank">shootingstars</a> 2007-07-31 13:17 <a href="http://www.cppblog.com/shootingstars/archive/2007/07/31/29071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::regex学习</title><link>http://www.cppblog.com/shootingstars/archive/2007/07/30/29029.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Mon, 30 Jul 2007 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/shootingstars/archive/2007/07/30/29029.html</guid><wfw:comment>http://www.cppblog.com/shootingstars/comments/29029.html</wfw:comment><comments>http://www.cppblog.com/shootingstars/archive/2007/07/30/29029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shootingstars/comments/commentRss/29029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shootingstars/services/trackbacks/29029.html</trackback:ping><description><![CDATA[一：编译<br>boost的正则表达式需要编译（如果不需要全部Boost的功能的话，请不要build all boost，那会花掉好几个小时。我推荐仅仅build需要的库就好。）<br>原有的boost 1.33似乎使用vc8编译的时候有问题。下载boost 1.34.1，使用&#8220;Visual Studio 2005 Command Prompt&#8221;，进入到boost_1_34_1\libs\regex\build：<br>nmake vc8.mak<br>OK，生成的文件在vc80下。<br><br>二：学习正则表达式<br><a title="http://www.cppblog.com/Files/shootingstars/deelx_zh.rar" href="http://www.cppblog.com/Files/shootingstars/deelx_zh.rar">http://www.cppblog.com/Files/shootingstars/deelx_zh.rar</a><br>不错的正则表达式的学习资料，顺便推荐一下：<br>http://www.regexlab.com/<br>这个站长还与我有个一信之缘（我写的<a title="P2P之UDP穿透NAT的原理与实现（附源代码）" href="http://www.cppblog.com/shootingstars/archive/2007/06/12/26140.html">P2P之UDP穿透NAT的原理与实现（附源代码）</a>）。站长的这个正则库在CodeProject获得了不错的评价。<br><br>三：简单的例子<br>&nbsp;&nbsp;&nbsp; std::string regstr = "a+";<br>&nbsp;&nbsp;&nbsp; boost::regex expression(regstr);<br>&nbsp;&nbsp;&nbsp; std::string testString = "aaa";<br><br>&nbsp;&nbsp;&nbsp; // 匹配至少一个a<br>&nbsp;&nbsp;&nbsp; if( boost::regex_match(testString, expression) )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout&lt;&lt; "Match" &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; std::cout&lt;&lt; "Not Match" &lt;&lt; std::endl;<br>&nbsp;&nbsp;&nbsp; }<br><span style="font-family: monospace;"></span>    <img src ="http://www.cppblog.com/shootingstars/aggbug/29029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shootingstars/" target="_blank">shootingstars</a> 2007-07-30 17:30 <a href="http://www.cppblog.com/shootingstars/archive/2007/07/30/29029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::algorithm学习</title><link>http://www.cppblog.com/shootingstars/archive/2007/07/26/28813.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Thu, 26 Jul 2007 06:12:00 GMT</pubDate><guid>http://www.cppblog.com/shootingstars/archive/2007/07/26/28813.html</guid><wfw:comment>http://www.cppblog.com/shootingstars/comments/28813.html</wfw:comment><comments>http://www.cppblog.com/shootingstars/archive/2007/07/26/28813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shootingstars/comments/commentRss/28813.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shootingstars/services/trackbacks/28813.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: boost::algorithm提供了很多字符串算法，包括：<br>大小写转换；<br>去除无效字符；<br>谓词；<br>查找；<br>删除/替换；<br>切割；<br>连接；<br>我们用写例子的方式来了解boost::algorithm能够为我们做些什么。&nbsp;&nbsp;<a href='http://www.cppblog.com/shootingstars/archive/2007/07/26/28813.html'>阅读全文</a><img src ="http://www.cppblog.com/shootingstars/aggbug/28813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shootingstars/" target="_blank">shootingstars</a> 2007-07-26 14:12 <a href="http://www.cppblog.com/shootingstars/archive/2007/07/26/28813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>是我rp不好，还是Microsoft的rp不好。。。</title><link>http://www.cppblog.com/shootingstars/archive/2007/06/19/26639.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Tue, 19 Jun 2007 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/shootingstars/archive/2007/06/19/26639.html</guid><wfw:comment>http://www.cppblog.com/shootingstars/comments/26639.html</wfw:comment><comments>http://www.cppblog.com/shootingstars/archive/2007/06/19/26639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shootingstars/comments/commentRss/26639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shootingstars/services/trackbacks/26639.html</trackback:ping><description><![CDATA[程序原来一直跑的挺好的。。。<br>But从昨天下午开始，没有修改任何代码，编译程序，然后运行。。。报错，说什么buffer overrun错误。哦，以前遇到过类似情况，可能是动态库和lib文件不一致导致的。没关系，ReBuild整个项目（得稍微花点时间，呵呵，乘着这个机会，上网溜达会）。花了15分钟，Build完了。满怀信心的执行。。。啊，又报错了。。。还是同样的问题。嗯，想想，难道是Vss上面有人修改东西了，我无意间获取了最新版本？有这个可能。于是上Vss看Show History。似乎这几天代码都没有变化。。。那是什么问题？我就不信邪了，再次ReBuild，又是一个15分钟。运行，出错。啊。。。<br>于是上google搜索出错信息，嗯，有那边几页，不过看完了，要么是没有回复，要么跟我的情况牛头不对马嘴。嗯，看来这种情况还挺特殊，看来还得自力更生了。<br>于是删除所有代码，从Vss在下载最新的，再次ReBuild。嗯，编译没有错，运行。。。嗯，也不算有错，只不过一个第三方的库运行时报了个异常。这个。。。再次检查代码，没有发现问题。汗，于是出来了。。。<br><br>今天早上上班继续倒腾，这个Vss版本有问题，下个以前的Label的，应该不会有问题了吧。于是再次ReBuild，运行，这回不再是buffer overrun，也不是异常了，而是报heap corruption。我晕倒中。。。<br><br>在重新ReBuild了n回后，花了n个15分钟后。我彻底没辙了。于是我向上帝祈祷，神啊，救救我吧。<br><br>于是，神听到了，发出了它的神力，在我百般无赖，手足无措的时候，我再次下载的最新的Vss代码版本，ReBuild，于是运行通过。<br><br>嗯，唉，是我rp不好，还是Microsoft的rp不好（我用的VC8）。。。我无语，希望高人指点问题原因。<br><img src ="http://www.cppblog.com/shootingstars/aggbug/26639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shootingstars/" target="_blank">shootingstars</a> 2007-06-19 17:26 <a href="http://www.cppblog.com/shootingstars/archive/2007/06/19/26639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>五种迭代器</title><link>http://www.cppblog.com/shootingstars/archive/2007/06/13/26264.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Wed, 13 Jun 2007 10:35:00 GMT</pubDate><guid>http://www.cppblog.com/shootingstars/archive/2007/06/13/26264.html</guid><wfw:comment>http://www.cppblog.com/shootingstars/comments/26264.html</wfw:comment><comments>http://www.cppblog.com/shootingstars/archive/2007/06/13/26264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shootingstars/comments/commentRss/26264.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shootingstars/services/trackbacks/26264.html</trackback:ping><description><![CDATA[1 InputIterator 可以被用来读取容器中的元素但是不保证支持向容器的写入操作<br>InputIterator 必须提供下列最小支持提供其他支持的iterator 也可被用作InputIterator 只要<br>它们满足这个最小要求集两个iterator 的相等和不相等测试通过operator ++ 的前置和<br>后置实例向前递增iterator 指向下一个元素通过解引用操作符operator * 读取一个元素<br>求在这个层次上提供支持的泛型算法包括find() accumulate()和equal() 任何一个算法如果<br>要求InputIterator 那么我们也可以向其传递第3 4 5 项列出的iterator 类别中的任一个<br><span style="font-weight: bold;">即：只要某个类实现上面的操作既可以被认为是InputIterator。</span><br>2 OutputIterator 可以被认为是与InputIterator 功能相反的iterator 即它可以被用来向容<br>器写入元素但是不保证支持读取容器的内容OutputIterator 一般被用作算法的第三个实参<br>标记出起始写入的位置例如copy()取OutputIterator 作为第三个实参任何一个算法如果<br>要求OutputIterator 那么我们也可以向其传递第3 4 5 项列出的iterator 类别中的任一个<br><span style="font-weight: bold;">注意：这个迭代器似乎仅仅实现了赋值操作即可
</span><br>3 ForwardIterator 可以被用来以某一个遍历方向是的下一个类别支持双向遍历向<br>容器读或写有些泛型算法至少要求ForwardIterator 包括adjacent_find() swap_range()和<br>replace() 当然任何要求ForwardIterator 支持的算法都可以向其传递第4 和5 项定义的iterator<br>类别<br><span style="font-weight: bold;">注意：这个迭代器既符合InputIterator又符合OutputIterator，同样下面两个也是这样。支持</span><span style="font-weight: bold;">operator++操作</span><br>4 BidirectionalIterator 从两个方向读或写一个容器有些泛型算法至少要求<br>BidirectionalIterator 包括inplace_merge() next_permutation()和reverse()<br><span style="font-weight: bold;">注意：继承1，2，3的特性，并且支持</span><span style="font-weight: bold;">operator--操作</span><br>5 RandomAccessIterator 除了支持BidirectionalIterator 所有的功能之外还提供了在<br>常数时间内访问容器的任意位置的支持要求RandomAccessIterator 支持的泛型算法包括<br>binary_search() sort_heap()和nth_element()
<br><span style="font-weight: bold;">注意：</span><span style="font-weight: bold;">继承1，2，3的特性，并且</span><span style="font-weight: bold;">符合随机访问策略，即支持operator[]操作</span><br>  <img src ="http://www.cppblog.com/shootingstars/aggbug/26264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shootingstars/" target="_blank">shootingstars</a> 2007-06-13 18:35 <a href="http://www.cppblog.com/shootingstars/archive/2007/06/13/26264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++泛型算法笔记（1）</title><link>http://www.cppblog.com/shootingstars/archive/2007/06/13/26263.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Wed, 13 Jun 2007 10:14:00 GMT</pubDate><guid>http://www.cppblog.com/shootingstars/archive/2007/06/13/26263.html</guid><wfw:comment>http://www.cppblog.com/shootingstars/comments/26263.html</wfw:comment><comments>http://www.cppblog.com/shootingstars/archive/2007/06/13/26263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shootingstars/comments/commentRss/26263.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shootingstars/services/trackbacks/26263.html</trackback:ping><description><![CDATA[<span style="font-weight: bold;">find</span><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ForwardIterator,&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Type&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>ForwardIterator<br>find(&nbsp;ForwardIterator&nbsp;first,&nbsp;ForwardIterator&nbsp;last,&nbsp;Type&nbsp;value&nbsp;)</span><span style="color: #000000;"><br></span></div>
find返回一个迭代器，表明是否找到元素，如果找不到返回参数的last。<br>参数<br>first：开始搜索的第一个元素<br>last：搜索到此元素之前，不包括此元素<br>value：需要搜索的值<br><br><span style="font-weight: bold;">back_inserter</span><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;_Container</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>back_insert_iterator</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">_Container</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>back_inserter(_Container</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;_Cont)</span></div>
这个函数返回一个迭代器<span style="color: #000000;">back_insert_iterator</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">_Container</span><span style="color: #000000;">&gt;，这个迭代器是从OutputIterator继承过来的，表明这个迭代器可以被写入。这个迭代器重写了赋值操作，在赋值操作中使用push_back将元素插入容器中。<br>参数<br>_Cont：希望被插入值的容器<br><br><span style="font-weight: bold;">copy</span><br></span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">template&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;InputIterator,&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;OutputIterator&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>OutputIterator<br>copy(&nbsp;InputIterator&nbsp;first1,&nbsp;InputIterator&nbsp;last,<br>OutputIterator&nbsp;first2&nbsp;);</span></div>
这个函数返回一个OutputIterator迭代器<br>参数<br>first：开始拷贝的第一个元素<br>last：拷贝到此元素之前，不包括此元素<br>first2：拷贝到此迭代器。我们可以使用上面的back_inserter函数返回的OutputIterator
<br>  <img src ="http://www.cppblog.com/shootingstars/aggbug/26263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shootingstars/" target="_blank">shootingstars</a> 2007-06-13 18:14 <a href="http://www.cppblog.com/shootingstars/archive/2007/06/13/26263.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何删除C++容器中的值</title><link>http://www.cppblog.com/shootingstars/archive/2007/06/12/26144.html</link><dc:creator>shootingstars</dc:creator><author>shootingstars</author><pubDate>Tue, 12 Jun 2007 09:37:00 GMT</pubDate><guid>http://www.cppblog.com/shootingstars/archive/2007/06/12/26144.html</guid><wfw:comment>http://www.cppblog.com/shootingstars/comments/26144.html</wfw:comment><comments>http://www.cppblog.com/shootingstars/archive/2007/06/12/26144.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shootingstars/comments/commentRss/26144.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shootingstars/services/trackbacks/26144.html</trackback:ping><description><![CDATA[C++的容器中一般都提供erase函数，此函数接收的参数一般有一个是一个迭代器：<br>如果删除某一个值的话，我们可能一般都用过：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">list</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;todo&nbsp;insert&nbsp;items<img style="width: 30px; height: 20px;" src="http://www.cppblog.com/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(list</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;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c.begin();&nbsp;i</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;c.end();&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((</span><span style="color: #000000;">*</span><span style="color: #000000;">i)</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果有一个值大于10，删除之</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.erase(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
上述代码在删除一个元素的时候并没有问题。。。但是我们想删除所有大于10的值，于是：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">list</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;todo&nbsp;insert&nbsp;items</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(list</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;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c.begin();&nbsp;i</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;c.end();&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">i)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((</span><span style="color: #000000;">*</span><span style="color: #000000;">i)</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;删除所有大于10的值</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.erase(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
满怀希望的编译，运行。。。于是异常发生。。。<br>啊。。。哦。。。<br>原来是删除迭代器i后，i所指的元素已经失效了，然后给i++，它已经不在存在了。。。于是绞尽脑汁，出笼了下面的代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">list</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;todo&nbsp;insert&nbsp;items</span><span style="color: #008000;"><br></span><span style="color: #000000;">list</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;nextitr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c.begin();<br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(list</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;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c.begin();;)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(nextitr&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;c.end())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">++</span><span style="color: #000000;">nextitr;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((</span><span style="color: #000000;">*</span><span style="color: #000000;">i)</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果有一个值大于10，删除之</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.erase(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;nextitr;<br>}<br></span></div>
上面的代码很容易理解，即在删除一个迭代器之前，把它的之后的迭代器先存储，然后在下次循环的时候利用之前存储的迭代器。<br>OK，我们看到上面这段代码可以工作了，行为似乎也还正确，只是。。。代码似乎多了点。我想代码能够少点就好了，逻辑也不要那么麻烦。那么我们看下面的代码（转载自Effective STL）。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">list</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;todo&nbsp;insert&nbsp;items</span><span style="color: #008000;"></span><span style="color: #000000;"></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(list</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;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;c.begin();&nbsp;i</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;c.end();)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((</span><span style="color: #000000;">*</span><span style="color: #000000;">i)</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果有一个值大于10，删除之</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.erase(i</span><span style="color: #000000;">++</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>}<br></span></div>
嗯。。。高手就是高手（我以前根本没有在意过++i和i++在使用的过程中能有这么大的区别）<br>好了，最后再提供一个版本，利用list的remove_if函数。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">bool</span><span style="color: #000000;">&nbsp;fun(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(i</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">10</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br>}<br><br>list</span><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;c;<br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;todo&nbsp;insert&nbsp;items</span><span style="color: #008000;"><br></span><span style="color: #000000;">c.remove_if(fun);</span></div>
嗯，其实删除一个容器中的值的方式还是挺多的。<br>   <img src ="http://www.cppblog.com/shootingstars/aggbug/26144.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shootingstars/" target="_blank">shootingstars</a> 2007-06-12 17:37 <a href="http://www.cppblog.com/shootingstars/archive/2007/06/12/26144.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>