﻿<?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++博客-面对现实，超越自己-随笔分类-STL</title><link>http://www.cppblog.com/wanghaiguang/category/19428.html</link><description>逆水行舟，不进则退</description><language>zh-cn</language><lastBuildDate>Fri, 29 May 2015 02:03:00 GMT</lastBuildDate><pubDate>Fri, 29 May 2015 02:03:00 GMT</pubDate><ttl>60</ttl><item><title>STL中用erase()方法遍历删除元素失效的问题</title><link>http://www.cppblog.com/wanghaiguang/archive/2013/10/14/203714.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 14 Oct 2013 10:22:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2013/10/14/203714.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/203714.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2013/10/14/203714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/203714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/203714.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;STL中的容器按存储方式分为两类：一类是按以数组形式存储的容器（如：vector，deque）；另一类是以不连续的节点形式存储的容器（如：list，map，set）。</span><br /><span style="font-size: 12pt;">&nbsp; &nbsp; &nbsp; 在使用erase方法删除元素时，</span><span style="color: #333333; font-family: Arial; font-size: 12pt; line-height: 26px; background-color: #ffffff;">迭代器有时候会失效。</span><span style="background-color: #ffffff; color: #333333; font-family: Arial; font-size: 16px; line-height: 26px;">在Effective STL，条款9，找到了erase容器中元素的原则。<br /></span><p style="color: #333333; font-family: Arial; font-size: 16px; line-height: 26px; background-color: #ffffff;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="font-size: 12pt;">1. 对于关联容器(如map, set, multimap,multiset)，删除当前的iterator，仅仅会使当前的iterator失效，只要在erase时，递增当前iterator即可。</span><span style="color: #ff6600; font-size: 12pt;">这是因为map之类的容器，使用了红黑树来实现，插入、删除一个结点不会对其他结点造成影响。</span><span style="color: #ff6600;"><br /></span><strong>错误的使用方法</strong>：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; std::map</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&lt;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">,&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&gt;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;mapTest;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;std::map</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&lt;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">,&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&gt;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">::iterator&nbsp;iter;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">for</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;(&nbsp;iter&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">=</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;mapTest.begin();iter&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">!=</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;mapTest.end();&nbsp;iter&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">++</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;)&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">if</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;(&nbsp;iter</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">-&gt;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">second&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">"</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">test</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">"</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;)&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapTest.erase(&nbsp;iter&nbsp;);&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></div><br /><strong style="font-size: 12pt;">正确的使用方法1：</strong><strong><br /></strong><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="font-size: 12pt; font-family: Verdana;">&nbsp; &nbsp;&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">std::map</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&lt;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">,&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&gt;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;mapTest;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;std::map</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&lt;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">,&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&gt;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">::iterator&nbsp;iter;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">for</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;(&nbsp;iter&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">=</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;mapTest.begin();iter&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">!=</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;mapTest.end();)&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">if</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;(&nbsp;iter</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">-&gt;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">second&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">"</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">test</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">"</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;)&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapTest.erase(&nbsp;iter</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">++</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;);&nbsp;<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">else</span><span style="color: #000000; "><br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">++</span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">;&nbsp;</span><span style="color: #008000; font-family: Verdana; font-size: 12pt;">//</span><span style="color: #008000; font-family: Verdana; font-size: 12pt;">&nbsp;Use&nbsp;Pre&nbsp;Increment&nbsp;for&nbsp;efficiency.&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #000000; font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></div>&nbsp; &nbsp; &nbsp;<span style="font-size: 12pt;">&nbsp;因为iter传给erase方法的是一个副本，iter++会指向下一个元素。</span><br />&nbsp;<br /><strong style="font-size: 12pt;">正确的使用方法2：<br /></strong><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; std::map&lt;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="font-family: Verdana; font-size: 12pt;">,&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="font-family: Verdana; font-size: 12pt;">&gt;</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;mapTest;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp; &nbsp; std::map</span><span style="font-family: Verdana; font-size: 12pt;">&lt;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="font-family: Verdana; font-size: 12pt;">,&nbsp;</span><span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">string</span><span style="font-family: Verdana; font-size: 12pt;">&gt;</span><span style="font-family: Verdana; font-size: 12pt;">::iterator&nbsp;iter;&nbsp;</span><br />&nbsp; &nbsp; &nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">for</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;(&nbsp;iter&nbsp;</span><span style="font-family: Verdana; font-size: 12pt;">=</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;mapTest.begin();iter&nbsp;</span><span style="font-family: Verdana; font-size: 12pt;">!=</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;mapTest.end();)&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">if</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;(&nbsp;iter</span><span style="font-family: Verdana; font-size: 12pt;">-&gt;</span><span style="font-family: Verdana; font-size: 12pt;">second&nbsp;</span><span style="font-family: Verdana; font-size: 12pt;">==</span>&nbsp;<span style="font-family: Verdana; font-size: 12pt;">"</span><span style="font-family: Verdana; font-size: 12pt;">test</span><span style="font-family: Verdana; font-size: 12pt;">"</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;)&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;</span><span style="font-family: Verdana; font-size: 12pt;">=</span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;mapTest.erase(&nbsp;iter&nbsp;);&nbsp;</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff; font-family: Verdana; font-size: 12pt;">else</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="font-family: Verdana; font-size: 12pt;">++</span><span style="font-family: Verdana; font-size: 12pt;">iter;&nbsp;</span><span style="color: #008000; font-family: Verdana; font-size: 12pt;">//</span><span style="color: #008000; font-family: Verdana; font-size: 12pt;">&nbsp;Use&nbsp;Pre&nbsp;Increment&nbsp;for&nbsp;efficiency.&nbsp;</span><span style="color: #008000; "><br /></span><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Verdana; font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span></div><br />&nbsp; &nbsp; &nbsp; &nbsp; <span style="font-size: 12pt;">&nbsp;2. 对于序列式容器(如vector,deque)，删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存，删除一个元素导致后面所有的元素会向前移动一个位置。还好</span><span style="color: #ff6600; font-size: 12pt;">erase方法可以返回下一个有效的iterator</span><span style="font-size: 12pt;">。</span><br /><span style="font-size: 12pt;">&nbsp; &nbsp; &nbsp; &nbsp;3. 对于list来说，它使用了不连续分配的内存，并且它的erase方法也会返回下一个有效的iterator，因此上面两种正确的方法都可以使用。</span><br />&nbsp; &nbsp; &nbsp;&nbsp;<br />其他链接：<a href="http://www.cppblog.com/Herbert/archive/2009/01/08/70479.html">http://www.cppblog.com/Herbert/archive/2009/01/08/70479.html<br />其他</a>链接：<a href="http://blog.csdn.net/kay226/article/details/6126515">http://blog.csdn.net/kay226/article/details/6126515<br />其他链接</a>：<a href="http://www.cppblog.com/humanchao/archive/2013/04/22/199630.html">http://www.cppblog.com/humanchao/archive/2013/04/22/199630.html</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/203714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2013-10-14 18:22 <a href="http://www.cppblog.com/wanghaiguang/archive/2013/10/14/203714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL迭代器及总结</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177647.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Tue, 05 Jun 2012 05:59:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177647.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177647.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177647.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177647.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt"><strong>解释</strong></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;迭代器是一种对象，它能够用来遍历STL容器中的部分或全部元素，每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口，所谓迭代器是一种概念上的抽象：那些行为上象迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力，它可以把抽象容器和通用算法有机的统一起来。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;迭代器提供一些基本操作符：*、++、==、！=、=。这些操作和C/C++&#8220;操作array元素&#8221;时的指针接口一致。不同之处在于，迭代器是个所谓的smart pointers，具有遍历复杂数据结构的能力。其下层运行机制取决于其所遍历的数据结构。因此，每一种容器型别都必须提供自己的迭代器。事实上每一种容器都将其迭代器以嵌套的方式定义于内部。因此各种迭代器的接口相同，型别却不同。这直接导出了泛型程序设计的概念：所有操作行为都使用相同接口，虽然它们的型别不同。<br /><br /><span style="font-size: 12pt"><strong>功能特点</strong></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;迭代器使开发人员不必整个实现类接口。只需提供一个迭代器，即可遍历类中的数据结构，可被用来访问一个容器类的所包函的全部元素，其行为像一个指针，但是只可被进行增加(++)或减少(--)操作。举一个例子，你可用一个迭代器来实现对vector容器中所含元素的遍历。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如下代码对vector容器对象生成和使用了迭代器： 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;the_vector;<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">vector</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;the_iterator;<br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;)<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">the_vector.push_back(i);<br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;total&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">the_iterator&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;the_vector.begin();<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">while</span><span style="color: #000000">(&nbsp;the_iterator&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;the_vector.end()&nbsp;)&nbsp;<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;total&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">the_iterator;<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;the_iterator</span><span style="color: #000000">++</span><span style="color: #000000">;<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Total=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;total&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;</span></div>提示：通过对一个迭代器的解引用操作（*），可以访问到容器所包含的元素。<br /><br /><strong>C++标准库总结<br /><br />容器<br />序列<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vector=========================&lt;vector&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list===========================&lt;list&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deque==========================&lt;deque&gt;<br /><br /><strong>序列适配器<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack:top,push,pop=============&lt;stack&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue:front,back,push,pop======&lt;queue&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;priority_queue:top,push,pop====&lt;queue&gt;<br /><br /><strong>关联容器<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map============================&lt;map&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multimap=======================&lt;map&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set============================&lt;set&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multiset=======================&lt;set&gt;<br /><br /><strong>拟容器<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string=========================&lt;string&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valarray=======================&lt;valarray&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitset=========================&lt;bitset&gt;<br /><br /><strong>算法</strong><br /><a href="http://www.cplusplus.com/reference/algorithm/"><strong style="color: #0000ff">http://www.cplusplus.com/reference/algorithm/</strong></a><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong style="color: red">STL Algorithms 详细说明</strong>。<br /><br /><strong>非修改性序列操作<br /></strong>&lt;algorithm&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for_each()=====================对序列中每个元素执行操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find()=========================在序列中找某个值的第一个出现<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find_if()======================在序列中找符合某谓词的第一个元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find_first_of()================在序列中找另一序列里的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adjust_find()==================找出相邻的一对值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count()========================在序列中统计某个值出现的次数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count_if()=====================在序列中统计与某谓词匹配的次数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mismatch()=====================找使两序列相异的第一个元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equal()========================如果两个序列对应元素都相同则为真<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search()=======================找出一序列作为子序列的第一个出现位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;find_end()=====================找出一序列作为子序列的最后一个出现位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;search_n()=====================找出一序列作为子序列的第n个出现位置<br /><strong>修改性的序列操作<br /></strong>&lt;algorithm&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transform()====================将操作应用于序列中的每个元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy()=========================从序列的第一个元素起进行复制<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copy_backward()================从序列的最后元素起进行复制<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap()=========================交换两个元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter_swap()====================交换由迭代器所指的两个元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swap_ranges()==================交换两个序列中的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replace()======================用一个给定值替换一些元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replace_if()===================替换满足谓词的一些元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replace_copy()=================复制序列时用一个给定值替换元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;replace_copy_if()==============复制序列时替换满足谓词的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill()=========================用一个给定值取代所有元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fill_n()=======================用一个给定值取代前n个元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generate()=====================用一个操作的结果取代所有元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generate_n()===================用一个操作的结果取代前n个元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove()=======================删除具有给定值的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove_if()====================删除满足谓词的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove_copy()==================复制序列时删除给定值的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove_copy_if()===============复制序列时删除满足谓词的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unique()=======================删除相邻的重复元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unique_copy()==================复制序列时删除相邻的重复元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reexample()======================反转元素的次序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reexample_copy()=================复制序列时反转元素的次序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotate()=======================循环移动元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rotate_copy()==================复制序列时循环移动元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;random_shuffle()===============采用均匀分布随机移动元素<br /><strong>序列排序<br /></strong>&lt;algorithm&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort()=========================以很好的平均次序排序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stable_sort()==================排序且维持相同元素原有的顺序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;partial_sort()=================将序列的前一部分排好序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;partial_sort_copy()============复制的同时将序列的前一部分排好序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nth_element()==================将第n个元素放到它的正确位置<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lower_bound()==================找到某个值的第一个出现<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upper_bound()==================找到大于某个值的第一个出现<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equal_range()==================找出具有给定值的一个子序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binary_search()================在排好序的序列中确定给定元素是否存在<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;merge()========================归并两个排好序的序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inplace_merge()================归并两个接续的排好序的序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;partition()====================将满足某谓词的元素都放到前面<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stable_partition()=============将满足某谓词的元素都放到前面且维持原顺序<br /><strong>集合算法<br /></strong>&lt;algorithm&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include()======================如果一个序列是另一个的子序列则为真<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_union()====================构造一个已排序的并集<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_intersection()=============构造一个已排序的交集<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_difference()===============构造一个已排序序列，包含在第一个序列但不在第二个序列的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_symmetric_difference()=====构造一个已排序序列，包括所有只在两个序列之一中的元素<br /><strong>堆操作<br /></strong>&lt;algorithm&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;make_heap()====================将序列高速得能够作为堆使用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push_heap()====================向堆中加入一个元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop_heap()=====================从堆中去除元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort_heap()====================对堆排序<br /><strong>最大和最小<br /></strong>&lt;algorithm&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min()==========================两个值中较小的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max()==========================两个值中较大的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min_element()==================序列中的最小元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_element()==================序列中的最大元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lexicographic_compare()========两个序列中按字典序的第一个在前<br /><strong>排列<br /></strong>&lt;algorithm&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_permutation()=============按字典序的下一个排列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev_permutation()=============按字典序的前一个排列<br /><strong>通用数值算法<br /></strong>&lt;numeric&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;accumulate()===================积累在一个序列中运算的结果(向量的元素求各的推广)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inner_product()================积累在两个序列中运算的结果(内积)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;partial_sum()==================通过在序列上的运算产生序列(增量变化)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adjacent_difference()==========通过在序列上的运算产生序列(与partial_sum相反)<br /><strong>C风格算法<br /></strong>&lt;cstdlib&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;qsort()========================快速排序，元素不能有用户定义的构造，拷贝赋值和析构函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bsearch()======================二分法查找，元素不能有用户定义的构造，拷贝赋值和析构函数<br /><strong style="font-size: 14pt"><br />函数对象<br /></strong><strong>基类</strong><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;class Arg, class Res&gt; struct unary_function<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;class Arg, class Arg2, class Res&gt; struct binary_function<br /><strong>谓词<br /></strong>返回bool的函数对象。<br />&lt;functional&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equal_to=======================二元，arg1 == arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not_equal_to===================二元，arg1 != arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;greater========================二元，arg1 &gt; arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;less===========================二元，arg1 &lt; arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;greater_equal==================二元，arg1 &gt;= arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;less_equal=====================二元，arg1 &lt;= arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logical_and====================二元，arg1 &amp;&amp; arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logical_or=====================二元，arg1 || arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logical_not====================一元，!arg<br /><strong>算术函数对象<br /></strong>&lt;functional&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;plus===========================二元，arg1 + arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minus==========================二元，arg1 - arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multiplies=====================二元，arg1 * arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;divides========================二元，arg1 / arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;modulus========================二元，arg1 % arg2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;negate=========================一元，-arg<br /><strong>约束器，适配器和否定器<br /></strong>&lt;functional&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind2nd(y)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binder2nd==================以y作为第二个参数调用二元函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bind1st(x)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binder1st==================以x作为第一个参数调用二元函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem_fun()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem_fun_t==================通过指针调用0元成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem_fun1_t=================通过指针调用一元成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const_mem_fun_t============通过指针调用0元const成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const_mem_fun1_t===========通过指针调用一元const成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem_fun_ref()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem_fun_ref_t==============通过引用调用0元成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mem_fun1_ref_t=============通过引用调用一元成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const_mem_fun_ref_t========通过引用调用0元const成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const_mem_fun1_ref_t=======通过引用调用一元const成员函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr_fun()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer_to_unary_function==调用一元函数指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptr_fun()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer_to_binary_function=调用二元函数指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not1()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unary_negate===============否定一元谓词<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not2()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binary_negate==============否定二元谓词<br /><strong style="font-size: 14pt"><br />迭代器<br /></strong><strong>分类</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Output: *p= , ++<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Input: =*p , -&gt; , ++ , == , !=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Forward: *p= , =*p , -&gt; , ++ , == , !=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bidirectional: *p= , =*p -&gt; , [] , ++ , -- , == , !=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Random: += , -= , *p= , =*p -&gt; , [] , ++ , -- , + , - , == , != , &lt; , &gt; , &lt;= , &gt;=<br /><strong>插入器<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;class Cont&gt; back_insert_iterator&lt;Cont&gt; back_inserter(Cont&amp; c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;class Cont&gt; front_insert_iterator&lt;Cont&gt; front_inserter(Cont&amp; c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;class Cont, class Out&gt; insert_iterator&lt;Cont&gt; back_inserter(Cont&amp; c, Out p);<br /><strong>反向迭代器<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reexample_iterator===============rbegin(), rend()<br /><strong>流迭代器<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ostream_iterator===============用于向ostream写入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;istream_iterator===============用于向istream读出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ostreambuf_iterator============用于向流缓冲区写入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;istreambuf_iterator============用于向流缓冲区读出<br /><br /><strong style="font-size: 14pt">分配器</strong><strong style="font-size: 14pt"><br /></strong>&lt;memory&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;class T&gt; class std::allocator<br /><br /><strong style="font-size: 14pt">数值</strong><strong style="font-size: 14pt"><br /></strong><strong>数值的限制<br /></strong>&lt;limits&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;numeric_limits&lt;&gt;<br />&lt;climits&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CHAR_BIT<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT_MAX<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br />&lt;cfloat&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DBL_MIN_EXP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FLT_RADIX<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDBL_MAX<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br /><strong>标准数学函数<br /></strong>&lt;cmath&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double abs(double)=============绝对值(不在C中)，同fabs()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double fabs(double)============绝对值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double ceil(double d)==========不小于d的最小整数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double floor(double d)=========不大于d的最大整数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double sqrt(double d)==========d在平方根，d必须非负<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double pow(double d, double e)=d的e次幂<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double pow(double d, int i)====d的i次幂<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double cos(double)=============余弦<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double sin(double)=============正弦<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double tan(double)=============正切<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double acos(double)============反余弦<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double asin(double)============反正弦<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double atan(double)============反正切<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double atan2(double x,double y) //atan(x/y)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double sinh(double)============双曲正弦<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double cosh(double)============双曲余弦<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double tanh(double)============双曲正切<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double exp(double)=============指数，以e为底<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double log(double d)===========自动对数(以e为底),d必须大于0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double log10(double d)=========10底对数，d必须大于0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double modf(double d,double*p)=返回d的小数部分，整数部分存入*p<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double frexp(double d, int* p)=找出[0.5,1)中的x,y,使d=x*pow(2,y),返回x并将y存入*p<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double fmod(double d,double m)=浮点数余数，符号与d相同<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double ldexp(double d, int i)==d*pow(2,i)<br />&lt;cstdlib&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int abs(int)===================绝对值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long abs(long)=================绝对值(不在C中)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long labs(long)================绝对值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct div_t { implementation_defined quot, rem; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct ldiv_t { implementation_defined quot, rem; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div_t div(int n, int d)========用d除n，返回(商，余数)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldiv_t div(long n, long d)=====用d除n，返回(商，余数)(不在C中)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldiv_t ldiv(long n, long d)====用d除n，返回(商，余数)<br /><strong>向量算术<br /></strong>&lt;valarray&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valarray<br /><strong>复数算术<br /></strong>&lt;complex&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;class T&gt; class std::complex; <img src ="http://www.cppblog.com/wanghaiguang/aggbug/177647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-05 13:59 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Queues(队列)、Priority Queues(优先队列)</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Tue, 05 Jun 2012 05:21:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177644.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177644.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177644.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt"><strong>C++ Queues(队列)</strong></span><br /><br />C++队列是一种容器适配器，它给予程序员一种先进先出(FIFO)的数据结构。<br />1.back() 返回一个引用，指向最后一个元素<br />2.empty() 如果队列空则返回真<br />3.front() 返回第一个元素<br />4.pop() 删除第一个元素<br />5.push() 在末尾加入一个元素<br />6.size() 返回队列中元素的个数<br /><br />队列可以用线性表(list)或双向队列(deque)来实现(注意vector container 不能用来实现queue，因为vector 没有成员函数pop_front!)：<br />queue&lt;list&lt;int&gt;&gt; q1;<br />queue&lt;deque&lt;int&gt;&gt; q2;<br />其成员函数有&#8220;判空(empty)&#8221; 、&#8220;尺寸(Size)&#8221; 、&#8220;首元(front)&#8221; 、&#8220;尾元(backt)&#8221; 、&#8220;加入队列(push)&#8221; 、&#8220;弹出队列(pop)&#8221;等操作。<br /><br />例：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span>&nbsp;<span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /></span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;queue</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;q;<br /></span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(</span><span style="color: #000000">4</span><span style="color: #000000">);<br /></span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(</span><span style="color: #000000">5</span><span style="color: #000000">);<br /></span><span style="color: #008080">6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,q.front());<br /></span><span style="color: #008080">7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.pop();<br /></span><span style="color: #008080">8</span>&nbsp;<span style="color: #000000">}</span></div><br /><strong><span style="font-size: 12pt">C++ Priorit</span>y Queues(优先队列)<br /></strong><br />C++优先队列类似队列，但是在这个数据结构中的元素按照一定的断言排列有序。<br />1.empty() 如果优先队列为空，则返回真<br />2.pop() 删除第一个元素<br />3.push() 加入一个元素<br />4.size() 返回优先队列中拥有的元素的个数<br />5.top() 返回优先队列中有最高优先级的元素<br /><br />优先级队列可以用向量(vector)或双向队列(deque)来实现(注意list container 不能用来实现queue，因为list 的迭代器不是任意存取iterator，而pop 中用到堆排序时是要求randomaccess iterator 的!)：<br />priority_queue&lt;vector&lt;int&gt;, less&lt;int&gt;&gt; pq1; // 使用递增less&lt;int&gt;函数对象排序<br />priority_queue&lt;deque&lt;int&gt;, greater&lt;int&gt;&gt; pq2; // 使用递减greater&lt;int&gt;函数对象排序<br />其成员函数有&#8220;判空(empty)&#8221; 、&#8220;尺寸(Size)&#8221; 、&#8220;栈顶元素(top)&#8221; 、&#8220;压栈(push)&#8221; 、&#8220;弹栈(pop)&#8221;等。<br /><br />例：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">queue</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T&nbsp;{<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;y,&nbsp;z;&nbsp;<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;T(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c):x(a),&nbsp;y(b),&nbsp;z(c)<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">};<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">t1,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">t2)&nbsp;<br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;t1.z&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;t2.z;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;按照z的顺序来决定t1和t2的顺序</span><span style="color: #008000"><br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">}&nbsp;<br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">main()<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">{&nbsp;<br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;priority_queue</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;q;&nbsp;<br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(T(</span><span style="color: #000000">4</span><span style="color: #000000">,</span><span style="color: #000000">4</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">));&nbsp;<br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(T(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">));&nbsp;<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(T(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">,</span><span style="color: #000000">4</span><span style="color: #000000">));&nbsp;<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(T(</span><span style="color: #000000">3</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">,</span><span style="color: #000000">6</span><span style="color: #000000">));&nbsp;<br /></span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">q.empty())&nbsp;<br /></span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;q.top();&nbsp;<br /></span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.pop();&nbsp;<br /></span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;t.x&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;t.y&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;t.z&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;&nbsp;<br /></span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /></span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;<br /></span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">}</span></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出结果为(注意是按照z的顺序从大到小出队的)： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 3 6 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 2 5 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 5 4 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 4 3<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再看一个按照z的顺序从小到大出队的例子：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">queue</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;&nbsp;<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T&nbsp;<br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">{&nbsp;<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">public</span><span style="color: #000000">:&nbsp;<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;x,&nbsp;y,&nbsp;z;&nbsp;<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;T(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;c):x(a),&nbsp;y(b),&nbsp;z(c)&nbsp;<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">};&nbsp;<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">t1,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">t2)&nbsp;<br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">{&nbsp;<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;t1.z&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;t2.z;&nbsp;<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">}&nbsp;<br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">main()&nbsp;<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">{&nbsp;<br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;priority_queue</span><span style="color: #000000">&lt;</span><span style="color: #000000">T,&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">,&nbsp;greater</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;q;&nbsp;<br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(T(</span><span style="color: #000000">4</span><span style="color: #000000">,</span><span style="color: #000000">4</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">));&nbsp;<br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(T(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">));&nbsp;<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(T(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">5</span><span style="color: #000000">,</span><span style="color: #000000">4</span><span style="color: #000000">));&nbsp;<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;q.push(T(</span><span style="color: #000000">3</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">,</span><span style="color: #000000">6</span><span style="color: #000000">));&nbsp;<br /></span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">q.empty())&nbsp;<br /></span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;q.top();&nbsp;<br /></span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.pop();&nbsp;<br /></span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;t.x&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;t.y&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;t.z&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;&nbsp;endl;&nbsp;<br /></span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /></span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;<br /></span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">}</span></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出结果为： <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 4 3 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 5 4 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 2 5 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 3 6<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果我们把第一个例子中的比较运算符重载为： bool operator &lt; (const T &amp;t1, const T &amp;t2) { return t1.z &gt; t2.z; // 按照z的顺序来决定t1和t2的顺序} 则第一个例子的程序会得到和第二个例子的程序相同的输出结果。<br /><br /><img src ="http://www.cppblog.com/wanghaiguang/aggbug/177644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-05 13:21 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Stacks（堆栈）</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177643.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Tue, 05 Jun 2012 05:16:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177643.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177643.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177643.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177643.html</trackback:ping><description><![CDATA[C++ Stack（堆栈） 是一个容器类的改编，为程序员提供了堆栈的全部功能，&#8212;&#8212;也就是说实现了一个先进后出（FILO）的数据结构。<br />1.empty() 堆栈为空则返回真<br />2.pop() 移除栈顶元素<br />3.push() 在栈顶增加元素<br />4.size() 返回栈中元素数目<br />5.top() 返回栈顶元素<br /><br />栈可以用向量(vector)、线性表(list)或双向队列(deque)来实现：<br />stack&lt;vector&lt;int&gt;&gt; s1;<br />stack&lt;list&lt;int&gt; &gt; s2;<br />stack&lt;deque&lt;int&gt;&gt; s3;<br />其成员函数有&#8220;判空(empty)&#8221; 、&#8220;尺寸(Size)&#8221; 、&#8220;栈顶元素(top)&#8221; 、&#8220;压栈(push)&#8221; 、&#8220;弹栈(pop)&#8221;等。<br /><br />范例引自：<a href="http://blog.csdn.net/morewindows/article/details/6950881">http://blog.csdn.net/morewindows/article/details/6950881</a><br /><br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">{&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">可以使用list或vector作为栈的容器，默认是使用deque的。&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;stack</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</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;&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;stack</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">,&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;b;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">压入数据&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;&nbsp;<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.push(i);&nbsp;&nbsp;<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.push(i);&nbsp;&nbsp;<br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">栈的大小&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d&nbsp;%d\n</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;a.size(),&nbsp;b.size());&nbsp;&nbsp;<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">取栈项数据并将数据弹出栈&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">a.empty())&nbsp;&nbsp;<br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;a.top());&nbsp;&nbsp;<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a.pop();&nbsp;&nbsp;<br /></span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /></span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;putchar(</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">);&nbsp;&nbsp;<br /></span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;<br /></span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">b.empty())&nbsp;&nbsp;<br /></span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br /></span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000">"</span><span style="color: #000000">%d&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;b.top());&nbsp;&nbsp;<br /></span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.pop();&nbsp;&nbsp;<br /></span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /></span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;putchar(</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">);&nbsp;&nbsp;<br /></span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;&nbsp;<br /></span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000">}&nbsp;&nbsp;<br /></span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000"></span></div><br /><img src ="http://www.cppblog.com/wanghaiguang/aggbug/177643.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-05 13:16 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177643.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Sets &amp; MultiSets</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177627.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Tue, 05 Jun 2012 02:51:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177627.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177627.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177627.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177627.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177627.html</trackback:ping><description><![CDATA[<strong style="font-size: 12pt">STL Set介绍<br /></strong><strong><br /></strong>集合(Set)是一种包含已排序对象的关联容器。多元集合(MultiSets)和集合(Sets)相像，只不过支持重复对象,其用法与set基本相同。<br />Set 又称集合，实际上就是一组元素的集合，但其中所包含的元素的值是唯一的，且是按一定顺序排列的，集合中的每个元素被称作集合中的实例。因为其内部是通过链表的方式来组织，所以在插入的时候比vector 快，但在查找和末尾添加上比vector 慢。<br />multiset 是多重集合，其实现方式和set 是相似的，只是它不要求集合中的元素是唯一的，也就是说集合中的同一个元素可以出现多次。<br /><br /><strong>构造：<br /></strong>explicit set(const Compare&amp;=compare()); <br />如：set&lt;int,less&lt;int&gt; &gt; set1; 
<div class="spctrl"></div>less&lt;int&gt;是一个标准类，用于形成升序排列函数对象。降序排列是用greater&lt;int&gt;。 
<div class="spctrl"></div>Template&lt;class InputIterator&gt; set(InputIterator, InputIterator,\ const Compare&amp;=compare()); 
<div class="spctrl"></div>如：set&lt;int ,less&lt;int&gt; &gt;set2(vector1.begin(),vector1.end()); 
<div class="spctrl"></div>通过指定某一预先定义的区间来初始化set对象的构造函数。 
<div class="spctrl"></div>set（const set&lt;Key,Compare&amp;&gt;）; 
<div class="spctrl"></div>如：set&lt;int ,less&lt;int&gt; &gt;set3(set2); <br /><br /><strong>方法：</strong><br />1.begin() 返回指向第一个元素的迭代器<br />2.clear() 清除所有元素<br />3.count() 返回某个值元素的个数<br />4.empty() 如果集合为空，返回true<br />5.end() 返回指向最后一个元素的迭代器<br />6.equal_range() 返回第一个&gt;=关键字的迭代器和&gt;关键字的迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pair &lt;iterator,iterator&gt;equal_range( const key_type &amp;key );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//key是用于排序的关键字<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;int&gt; ctr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例如：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pair&lt;set&lt;int&gt;::iterator,set&lt;int&gt;::iterarot&gt;p;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For(i=0;i&lt;=5;i++) ctr.insert(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P=ctr.equal_range(2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那么*p.first==2;*p.second==3;<br />7.erase() 删除集合中的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator erase( iterator i ); //删除i位置元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator erase( iterator start, iterator end );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//删除从start开始到end(end为第一个不被删除的值)结束的元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_type erase( const key_type &amp;key );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//删除等于key值的所有元素（返回被删除的元素的个数）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//前两个返回第一个不被删除的双向定位器,不存在返回末尾<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//第三个返回删除个数<br />8.find() 返回一个指向被查找到元素的迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator find( const key_type &amp;key );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查找等于key值的元素，并返回指向该元素的迭代器;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果没有找到,返回指向集合最后一个元素的迭代器<br />9.get_allocator() 返回集合的分配器<br />10.insert() 在集合中插入元素<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator insert( iterator i, const TYPE &amp;val ); //在迭代器i前插入val<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void insert( input_iterator start, input_iterator end );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将迭代器start开始到end（end不被插入）结束返回内的元素插入到集合中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pair insert( const TYPE &amp;val );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//插入val元素，返回指向该元素的迭代器和一个布尔值来说明val是否成功被插入<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//应该注意的是在集合(Sets中不能插入两个相同的元素)<br />11.lower_bound() 返回指向大于（或等于）某值的第一个元素的迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator lower_bound( const key_type &amp;key );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回一个指向大于或者等于key值的第一个元素的迭代器<br />12.key_comp() 返回一个用于元素间值比较的函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key_compare key_comp();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回一个用于元素间值比较的函数对象<br />13.max_size() 返回集合能容纳的元素的最大限值<br />14.rbegin() 返回指向集合中最后一个元素的反向迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;示例：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;int&gt; ctr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;int&gt;::reverse_iterator rcp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For(rcp=ctr.rbegin();rcp!=ctr.rend();rcp++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cout&lt;&lt;*rcp&lt;&lt;&#8221; &#8221;;<br />15.rend() 返回指向集合中第一个元素的反向迭代器<br />16.size() 集合中元素的数目<br />17.swap() 交换两个集合变量<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void swap( set &amp;object ); //交换当前集合和object集合中的元素<br />18.upper_bound() 返回大于某个值元素的迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator upwer_bound( const key_type &amp;key );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回一个指向大于key值的第一个元素的迭代器<br />19.value_comp() 返回一个用于比较元素间的值的函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;语法:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator upper_bound( const key_type &amp;key );//返回一个用于比较元素间的值的函数对象<br /><strong>20.Set集合的并，交和差<br /></strong>set_union(a.begin(),a.end(),b.begin(),b.end(),insert_iterator&lt;set&lt;int&gt; &gt;(c,c.begin()));<br />set_intersection(a.begin(),a.end(),b.begin(),b.end(),insert_iterator&lt;set&lt;int&gt; &gt;(c,c.begin()));<br />set_difference(a.begin(),a.end(),b.begin(),b.end(),insert_iterator&lt;set&lt;int&gt; &gt;(c,c.begin()));<br /><br />以下转自：<a href="http://blog.csdn.net/wangji163163/article/details/3740948">http://blog.csdn.net/wangji163163/article/details/3740948</a><br />
<div class="article_title"><span class="ico ico_type_Original"></span>
<h3><span class="link_title"><a href="http://blog.csdn.net/wangji163163/article/details/3740948">STL Set 交集 合集 差集 </a></span></h3></div>
<div id="article_content" class="article_content">
<p>Set是关联容器。其键值就是实值，实值就是键值，不可以有重复，所以我们不能通过set的迭代器来改变set的元素的值，set拥有和list相同的特性：当对他进行插入和删除操作的时候，操作之前的迭代器依然有效。当然删除了的那个就没效了。Set的底层结构是RB-tree，所以是有序的。</p>
<p>&nbsp;&nbsp; stl中特别提供了一种针对set的操作的算法：交集set_intersection，并集set_union，差集set_difference。对称差集set_symeetric_difference，这些算法稍后会讲到。</p>
<p>一：set模板类的声明。</p>
<p><strong></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span>&nbsp;<span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000"><br /></span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Key,&nbsp;<br /></span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Traits</span><span style="color: #000000">=</span><span style="color: #000000">less</span><span style="color: #000000">&lt;</span><span style="color: #000000">Key</span><span style="color: #000000">&gt;</span><span style="color: #000000">,&nbsp;<br /></span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Allocator</span><span style="color: #000000">=</span><span style="color: #000000">allocator</span><span style="color: #000000">&lt;</span><span style="color: #000000">Key</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /></span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000"></span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">6</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">。</span></div>
<p>其中个参数的意义如下：</strong></p>
<p><strong>key：</strong>要放入set里的数据类型，可以是任何类型的数据。</p>
<p><strong>Traits：</strong>这是一个仿函数（关于仿函数是什么，我后面的文章会讲到）。提供了具有比较功能的仿函数，来觉得元素在set里的排列的顺序，这是一个可选的参数，默认的是std::less&lt;key&gt;，如果要自己提供这个参数，那么必须要遵循此规则：具有两个参数，返回类型为bool。</p>
<p><strong>Allocator:</strong>空间配置器，这个参数是可选的，默认的是std::allocator&lt;key&gt;.</p>
<p><strong>二：set里的基本操作</strong></p>
<p><font color="#000000" size="2"><font size="1"><span style="font-size: 10pt">我们可以通过下面的方法来实例化一个set对</span></font><span style="font-size: 10pt">象</span></font></p>
<p><font color="#000000" size="2">std::set&lt;int&gt; s;那个s这个对象里面存贮的元素是从小到大排序的，(因为用std::less作为比较工具。)</font></p>
<p><font color="#000000" size="2">如果要想在s里面插入数据，可以用inset函数（set没用重载[]操作，因为set本生的值和索引是相同的)</font></p>
<p><font color="#000000" size="2">s.insert(3);s.insert(5).....</font></p>
<p><font color="#000000" size="2">因为set是集合，那么集合本身就要求是唯一性，所以如果要像set里面插入数据和以前的数据有重合，那么插入不成功。</font></p>
<p><font color="#000000" size="2">可以通过下面的方法来遍历set里面的元素</font></p>
<p><font size="2"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span>&nbsp;<span style="color: #000000">std::</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;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s.begin();<br /></span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">while</span><span style="color: #000000">(it</span><span style="color: #000000">!=</span><span style="color: #000000">s.end())<br /></span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">it</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">endl;</span><span style="color: #008000">//</span><span style="color: #008000">迭代器依次后移，直到末尾。</span><span style="color: #008000"><br /></span><span style="color: #008080">5</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">}</span></div>
<p>如果要查找一个元素用find函数，it = s.find(3);这样it是指向3的那个元素的。可以通过rbegin，rend来逆向遍历</font></p>
<p><font size="2"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span>&nbsp;<span style="color: #000000">std::</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">::reverse_iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s.rbegin();<br /></span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">while</span><span style="color: #000000">(it</span><span style="color: #000000">!=</span><span style="color: #000000">s.rend())<br /></span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000">{cout</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">it</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">endl;}</span></div>
<p>还有其他的一些操作在这就不一一列出了。</font></p>
<p><strong><font size="3">三：与set相关的一组算法</font></strong></p>
<p><font color="#ff00ff">set_intersection() :这个函数是求两个集合的交集</font>。下面是stl里的源代码</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;_InIt1,<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;_InIt2,<br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;_OutIt</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;inline<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">_OutIt&nbsp;set_intersection(_InIt1&nbsp;_First1,&nbsp;_InIt1&nbsp;_Last1,<br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;_InIt2&nbsp;_First2,&nbsp;_InIt2&nbsp;_Last2,&nbsp;_OutIt&nbsp;_Dest)<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">{&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;AND&nbsp;sets&nbsp;[_First1,&nbsp;_Last1)&nbsp;and&nbsp;[_First2,&nbsp;_Last2),&nbsp;using&nbsp;operator&lt;</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #008000"></span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(;&nbsp;_First1&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;_Last1&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;_First2&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;_Last2;&nbsp;)<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&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">_First1&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">_First2)<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">_First1;<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">_First2&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">_First1)<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">_First2;<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">_Dest</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">_First1</span><span style="color: #000000">++</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">_First2;<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(_Dest);<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">}</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是个模板函数，从上面的算法可以看出，传进去的两个容器必须是<font color="#ff00ff">有序</font>的。_Dest指向输出的容器，这个容器必须是预先分配好空间的，否则会出错的,返回值指向保存结果的容器的尾端的下一个位置。eg.<br /></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">set_union()&nbsp;:求两个集合的并集，参数要求同上。<br /></span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">std::set_difference（）：差集<br /></span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">set_symmetric_difference（）：得到的结果是第一个迭代器相对于第二个的差集并上第二个相当于第一个的差集。代码：<br /></span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;compare<br /></span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">&nbsp;()(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;s1,</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;s2)<br /></span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;s1</span><span style="color: #000000">&gt;</span><span style="color: #000000">s2;<br /></span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">}</span><span style="color: #808080">///</span><span style="color: #008000">自定义一个仿函数</span><span style="color: #808080"><br /></span><span style="color: #008080">13</span>&nbsp;<span style="color: #808080"></span><span style="color: #000000">};<br /></span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /></span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">{<br /></span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">typedef&nbsp;std::</span><span style="color: #0000ff">set</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">,compare</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;_SET;<br /></span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">_SET&nbsp;s;<br /></span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">s.insert(</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">sfdsfd</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">s.insert(</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">apple</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">s.insert(</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">english</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">s.insert(</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">dstd</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">s1:</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /></span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">std::</span><span style="color: #0000ff">set</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">,compare</span><span style="color: #000000">&gt;</span><span style="color: #000000">::iterator&nbsp;it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s.begin();<br /></span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">while</span><span style="color: #000000">(it</span><span style="color: #000000">!=</span><span style="color: #000000">s.end())<br /></span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">it</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">s2:</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /></span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">_SET&nbsp;s2;<br /></span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000">s2.insert(</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">abc</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">s2.insert(</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">apple</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">s2.insert(</span><span style="color: #0000ff">string</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">english</span><span style="color: #000000">"</span><span style="color: #000000">));<br /></span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000">it&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;s2.begin();<br /></span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">while</span><span style="color: #000000">(it</span><span style="color: #000000">!=</span><span style="color: #000000">s2.end())<br /></span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">it</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000">cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /></span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;str[</span><span style="color: #000000">10</span><span style="color: #000000">];<br /></span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">end&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;set_intersection(s.begin(),s.end(),s2.begin(),s2.end(),str,compare());</span><span style="color: #008000">//</span><span style="color: #008000">求交集，返回值指向str最后一个元素的尾端</span><span style="color: #008000"><br /></span><span style="color: #008080">38</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">result&nbsp;of&nbsp;set_intersection&nbsp;s1,s2:</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /></span><span style="color: #008080">39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str;<br /></span><span style="color: #008080">40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(first</span><span style="color: #000000">&lt;</span><span style="color: #000000">end)<br /></span><span style="color: #008080">41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">first</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">result&nbsp;of&nbsp;set_union&nbsp;of&nbsp;s1,s2</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /></span><span style="color: #008080">43</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;std::set_union(s.begin(),s.end(),s2.begin(),s2.end(),str,compare());</span><span style="color: #008000">//</span><span style="color: #008000">并集</span><span style="color: #008000"><br /></span><span style="color: #008080">44</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str;<br /></span><span style="color: #008080">45</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(first</span><span style="color: #000000">&lt;</span><span style="color: #000000">end)<br /></span><span style="color: #008080">46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">first</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">47</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">result&nbsp;of&nbsp;set_difference&nbsp;of&nbsp;s2&nbsp;relative&nbsp;to&nbsp;s1</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;&nbsp;<br /></span><span style="color: #008080">48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str;<br /></span><span style="color: #008080">49</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;std::set_difference(s.begin(),s.end(),s2.begin(),s2.end(),str,compare());</span><span style="color: #008000">//</span><span style="color: #008000">s2相对于s1的差集</span><span style="color: #008000"><br /></span><span style="color: #008080">50</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(first</span><span style="color: #000000">&lt;</span><span style="color: #000000">end)<br /></span><span style="color: #008080">51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">first</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">52</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">result&nbsp;of&nbsp;set_difference&nbsp;of&nbsp;s1&nbsp;relative&nbsp;to&nbsp;s2</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;&nbsp;<br /></span><span style="color: #008080">53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str;<br /></span><span style="color: #008080">54</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;std::set_difference(s2.begin(),s2.end(),s.begin(),s.end(),str,compare());</span><span style="color: #008000">//</span><span style="color: #008000">s1相对于s2的差集</span><span style="color: #008000"><br /></span><span style="color: #008080">55</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000"><br /></span><span style="color: #008080">56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(first</span><span style="color: #000000">&lt;</span><span style="color: #000000">end)<br /></span><span style="color: #008080">57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">first</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /></span><span style="color: #008080">59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str;<br /></span><span style="color: #008080">60</span>&nbsp;<span style="color: #000000">end&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;std::set_symmetric_difference(s.begin(),s.end(),s2.begin(),s2.end(),str,compare());</span><span style="color: #008000">//</span><span style="color: #008000">上面两个差集的并集</span><span style="color: #008000"><br /></span><span style="color: #008080">61</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(first</span><span style="color: #000000">&lt;</span><span style="color: #000000">end)<br /></span><span style="color: #008080">62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;*</span><span style="color: #000000">first</span><span style="color: #000000">++&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;&nbsp;<br /></span><span style="color: #008080">64</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">65</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">66</span>&nbsp;<span style="color: #000000"></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">&nbsp;&nbsp;&nbsp;s3&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">67</span>&nbsp;<span style="color: #000000"></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;&nbsp;&nbsp;iter&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;s3.begin()&nbsp;&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">68</span>&nbsp;<span style="color: #000000">set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s3,iter));&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080">69</span>&nbsp;<span style="color: #000000">copy(s3.begin(),s3.end(),&nbsp;&nbsp;&nbsp;ostream_iterator</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">(cout,</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">));</span></div>
<p><br />&nbsp;</p></div><img src ="http://www.cppblog.com/wanghaiguang/aggbug/177627.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-05 10:51 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/05/177627.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Maps &amp; MultiMaps</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177493.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 04 Jun 2012 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177493.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177493.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177493.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: C++ Maps &amp; MultiMapsC++ Maps是一种关联式容器，包含&#8220;关键字/值&#8221;对。 C++ Multimaps和maps很相似，但是MultiMaps允许重复的元素。 1.begin() 返回指向map头部的迭代器 2.clear() 删除所有元素 3.count() 返回指定元素出现的次数 &nbsp;&nbsp;&nbsp;语法...&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177493.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/177493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-04 16:57 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ Deque(双向队列) </title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177477.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 04 Jun 2012 07:57:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177477.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177477.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177477.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177477.html</trackback:ping><description><![CDATA[<p><strong><span style="font-size: 16pt">C++ Deque(</span></strong><span style="font-family: 黑体; font-size: 16pt">双向队列</span><strong><span style="font-size: 16pt">) </span></strong><span style="font-size: 16pt"></span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 12pt">&nbsp; 是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问，但它不像</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt">vector </span><span style="font-family: 宋体; font-size: 12pt">把所有的对象保存在一块连续的内存块，而是采用多个连续的存储块，并且在一个映射结构中保存对这些块及其顺序的跟踪。向</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt">deque </span><span style="font-family: 宋体; font-size: 12pt">两端添加或删除元素的开销很小。它不需要重新分配空间，所</span><span style="font-family: 宋体; font-size: 12pt">以向末端增加元素比</span><span style="font-family: 'Times New Roman','serif'; font-size: 12pt">vector </span><span style="font-family: 宋体; font-size: 12pt">更有效。 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp; 实际上，</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">deque </span><span style="font-family: 宋体; color: black; font-size: 12pt">是对</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">vector </span><span style="font-family: 宋体; color: black; font-size: 12pt">和</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">list </span><span style="font-family: 宋体; color: black; font-size: 12pt">优缺点的结合，它是处于两者之间的一种容器。 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 14pt"><strong>Deque </strong></span><span style="font-family: 宋体; color: black; font-size: 14pt"><strong>的特点：</strong> </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 11.5pt">&nbsp;&nbsp;&nbsp;</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt"> (1) </span><span style="font-family: 宋体; color: black; font-size: 12pt">随机访问方便，即支持</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">[ ] </span><span style="font-family: 宋体; color: black; font-size: 12pt">操作符和</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">vector.at() </span><span style="font-family: 宋体; color: black; font-size: 12pt">，但性能没有</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">vector </span><span style="font-family: 宋体; color: black; font-size: 12pt">好； </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp; (2) </span><span style="font-family: 宋体; color: black; font-size: 12pt">可以在内部进行插入和删除操作，但性能不及</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">list </span><span style="font-family: 宋体; color: black; font-size: 12pt">； </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp; (3) </span><span style="font-family: 宋体; color: black; font-size: 12pt">可以在两端进行</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">push </span><span style="font-family: 宋体; color: black; font-size: 12pt">、</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">pop </span><span style="font-family: 宋体; color: black; font-size: 12pt">； </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp; (4) </span><span style="font-family: 宋体; color: black; font-size: 12pt">相对于</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">verctor </span><span style="font-family: 宋体; color: black; font-size: 12pt">占用更多的内存。 </span></p>
<p><span style="font-family: 宋体; color: black; font-size: 12pt">双向队列和向量很相似，但是它允许在容器头部快速插入和删除（就像在尾部一样）。</span></p>
<p>&nbsp;</p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">1.Constructors </span><span style="font-family: 宋体; color: black; font-size: 12pt">创建一个新双向队列 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;语法</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">: </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deque();//</span><span style="font-family: 宋体; color: black; font-size: 12pt">创建一个空双向队列 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deque( size_type size );// </span><span style="font-family: 宋体; color: black; font-size: 12pt">创建一个大小为</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">size</span><span style="font-family: 宋体; color: black; font-size: 12pt">的双向队列 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deque( size_type num, const TYPE &amp;val ); //</span><span style="font-family: 宋体; color: black; font-size: 12pt">放置</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">num</span><span style="font-family: 宋体; color: black; font-size: 12pt">个</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">val</span><span style="font-family: 宋体; color: black; font-size: 12pt">的拷贝到队列中 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deque( const deque &amp;from );// </span><span style="font-family: 宋体; color: black; font-size: 12pt">从</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">from</span><span style="font-family: 宋体; color: black; font-size: 12pt">创建一个内容一样的双向队列 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deque( input_iterator start, input_iterator end ); </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// start </span><span style="font-family: 宋体; color: black; font-size: 12pt">和 </span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">end - </span><span style="font-family: 宋体; color: black; font-size: 12pt">创建一个队列，保存从</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">start</span><span style="font-family: 宋体; color: black; font-size: 12pt">到</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">end</span><span style="font-family: 宋体; color: black; font-size: 12pt">的元素。 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">2.Operators </span><span style="font-family: 宋体; color: black; font-size: 12pt">比较和赋值双向队列 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span style="font-family: 宋体; color: black; font-size: 12pt">可以使用</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">[]</span><span style="font-family: 宋体; color: black; font-size: 12pt">操作符访问双向队列中单个的元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">3.assign() </span><span style="font-family: 宋体; color: black; font-size: 12pt">设置双向队列的值 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;语法</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">: </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void assign( input_iterator start, input_iterator end); </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//start</span><span style="font-family: 宋体; color: black; font-size: 12pt">和</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">end</span><span style="font-family: 宋体; color: black; font-size: 12pt">指示的范围为双向队列赋值 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void assign( Size num, const TYPE &amp;val );//</span><span style="font-family: 宋体; color: black; font-size: 12pt">设置成</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">num</span><span style="font-family: 宋体; color: black; font-size: 12pt">个</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">val</span><span style="font-family: 宋体; color: black; font-size: 12pt">。 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">4.at() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回指定的元素&nbsp;<br /></span><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;语法</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">: </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference at( size_type pos ); </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回一个引用，指向双向队列中位置</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">pos</span><span style="font-family: 宋体; color: black; font-size: 12pt">上的元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">5.back() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回最后一个元素 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;语法</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">: </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference back();//</span><span style="font-family: 宋体; color: black; font-size: 12pt">返回一个引用，指向双向队列中最后一个元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">6.begin() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回指向第一个元素的迭代器 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;语法</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">: </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator begin();//</span><span style="font-family: 宋体; color: black; font-size: 12pt">返回一个迭代器，指向双向队列的第一个元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">7.clear() </span><span style="font-family: 宋体; color: black; font-size: 12pt">删除所有元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">8.empty() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回真如果双向队列为空 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">9.end() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回指向尾部的迭代器 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">10.erase() </span><span style="font-family: 宋体; color: black; font-size: 12pt">删除一个元素 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;语法</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">: </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator erase( iterator pos ); //</span><span style="font-family: 宋体; color: black; font-size: 12pt">删除</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">pos</span><span style="font-family: 宋体; color: black; font-size: 12pt">位置上的元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator erase( iterator start, iterator end ); //</span><span style="font-family: 宋体; color: black; font-size: 12pt">删除</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">start</span><span style="font-family: 宋体; color: black; font-size: 12pt">和</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">end</span><span style="font-family: 宋体; color: black; font-size: 12pt">之间的所有元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span style="font-family: 宋体; color: black; font-size: 12pt">返回指向被删除元素的后一个元素 </span></p>
<p><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">11.front() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回第一个元素的引用</span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">12.get_allocator() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回双向队列的配置器 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">13.insert() </span><span style="font-family: 宋体; color: black; font-size: 12pt">插入一个元素到双向队列中 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;语法</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">: </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator insert( iterator pos, size_type num, const TYPE &amp;val ); //pos</span><span style="font-family: 宋体; color: black; font-size: 12pt">前插入</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">num</span><span style="font-family: 宋体; color: black; font-size: 12pt">个</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">val</span><span style="font-family: 宋体; color: black; font-size: 12pt">值 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void insert( iterator pos, input_iterator start, input_iterator end ); </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//</span><span style="font-family: 宋体; color: black; font-size: 12pt">插入从</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">start</span><span style="font-family: 宋体; color: black; font-size: 12pt">到</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">end</span><span style="font-family: 宋体; color: black; font-size: 12pt">范围内的元素到</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">pos</span><span style="font-family: 宋体; color: black; font-size: 12pt">前面 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">14.max_size() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回双向队列能容纳的最大元素个数 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">15.pop_back() </span><span style="font-family: 宋体; color: black; font-size: 12pt">删除尾部的元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">16.pop_front() </span><span style="font-family: 宋体; color: black; font-size: 12pt">删除头部的元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">17.push_back() </span><span style="font-family: 宋体; color: black; font-size: 12pt">在尾部加入一个元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">18.push_front() </span><span style="font-family: 宋体; color: black; font-size: 12pt">在头部加入一个元素 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">19.rbegin() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回指向尾部的逆向迭代器 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">20.rend() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回指向头部的逆向迭代器 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">21.resize() </span><span style="font-family: 宋体; color: black; font-size: 12pt">改变双向队列的大小 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">22.size() </span><span style="font-family: 宋体; color: black; font-size: 12pt">返回双向队列中元素的个数 </span></p>
<p align="left"><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">23.swap() </span><span style="font-family: 宋体; color: black; font-size: 12pt">和另一个双向队列交换元素 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;语法： </span></p>
<p><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void swap( deque &amp;target );// </span><span style="font-family: 宋体; color: black; font-size: 12pt">交换</span><span style="font-family: 'Times New Roman','serif'; color: black; font-size: 12pt">target</span><span style="font-family: 宋体; color: black; font-size: 12pt">和现双向队列中元素</span></p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/177477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-04 15:57 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++ List(双向链表)</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177475.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 04 Jun 2012 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177475.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177475.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177475.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177475.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: List(双向链表)介绍:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List是一个线性链表结构，它的数据由若干个节点构成，每一个节点都包括一个信息块（即实际存储的数据）、一个前驱指针和一个后驱指针。它无需分配指定的内存大小且可以任意伸缩，这是因为它存储在非连续的内存空间中，并且由指针将有序的元素链接起来。 &nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177475.html'>阅读全文</a><img src ="http://www.cppblog.com/wanghaiguang/aggbug/177475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-04 15:50 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Vector介绍</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177416.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 04 Jun 2012 01:18:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177416.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177416.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177416.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177416.html</trackback:ping><description><![CDATA[<div>
<p align="left"><strong><span style="font-family: 宋体; color: black; font-size: 16pt">C++ Vector</span></strong><strong><span style="font-family: 宋体; color: black; font-size: 16pt">（向量容器） </span></strong></p>
<p style="text-indent: 23pt"><span style="font-family: 宋体; font-size: 11.5pt">是一个线性顺序结构。相当于数组，但其大小可以不预先指定，并且自动扩展。它可以像数组一样被操作，由于它的特性我们完全可以将</span><span style="font-family: 宋体; font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">看作动态数组。 </span></p>
<p style="text-indent: 23pt"><span style="font-family: 宋体; font-size: 11.5pt">在创建一个</span><span style="font-family: 宋体; font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">后，它会自动在内存中分配一块连续的内存空间进行数据</span><span style="font-family: 宋体; font-size: 11.5pt">存储，初始的空间大小可以预先指定也可以由</span><span style="font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">默认指定，这个大小即</span><span style="font-family: 宋体; font-size: 11.5pt">capacity </span><span style="font-family: 宋体; font-size: 11.5pt">（）函数的返回值。当存储的数据超过分配的空间时vector 会重新分配一块内存块，但这样的分配是很耗时的，在重新分配空间时它会做这样的动作： </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">首先，vector 会申请一块更大的内存块； </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">然后，将原来的数据拷贝到新的内存块中； </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">其次，销毁掉原内存块中的对象（调用对象的析构函数）； </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">最后，将原来的内存空间释放掉。 </span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">如果vector 保存的数据量很大时，这样的操作一定会导致糟糕的性能（这也是vector 被设计成比较容易拷贝的值类型的原因）。所以说vector 不是在什么情况下性能都好，只有在预先知道它大小的情况下vector 的性能才是最优的。</span></p>
<p align="left">&nbsp;</p>
<p><strong><span style="font-size: 14pt">vector </span></strong><strong><span style="font-family: 宋体; font-size: 14pt">的特点： </span></strong></p>
<p><span style="font-size: 11.5pt">(1) </span><span style="font-family: 宋体; font-size: 11.5pt">指定一块如同数组一样的连续存储，但空间可以动态扩展。即它可以像数组一样操作，并且可以进行动态操作。通常体现在</span><span style="font-size: 11.5pt">push_back() pop_back() </span><span style="font-family: 宋体; font-size: 11.5pt">。 </span></p>
<p><span style="font-size: 11.5pt">(2) </span><span style="font-family: 宋体; font-size: 11.5pt">随机访问方便，它像数组一样被访问，即支持</span><span style="font-size: 11.5pt">[ ] </span><span style="font-family: 宋体; font-size: 11.5pt">操作符和</span><span style="font-size: 11.5pt">vector.at() </span></p>
<p><span style="font-size: 11.5pt">(3) </span><span style="font-family: 宋体; font-size: 11.5pt">节省空间，因为它是连续存储，在存储数据的区域都是没有被浪费的，但是要明确一点</span><span style="font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">大多情况下并不是满存的，在未存储的区域实际是浪费的。 </span></p>
<p><span style="font-size: 11.5pt">(4) </span><span style="font-family: 宋体; font-size: 11.5pt">在内部进行插入、删除操作效率非常低，这样的操作基本上是被禁止的。</span><span style="font-size: 11.5pt">Vector </span><span style="font-family: 宋体; font-size: 11.5pt">被设计成只能在后端进行追加和删除操作，其原因是</span><span style="font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">内部的实现是按照顺序表的原理。 </span></p>
<p><span style="font-size: 11.5pt">(5) </span><span style="font-family: 宋体; font-size: 11.5pt">只能在</span><span style="font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">的最后进行</span><span style="font-size: 11.5pt">push </span><span style="font-family: 宋体; font-size: 11.5pt">和</span><span style="font-size: 11.5pt">pop </span><span style="font-family: 宋体; font-size: 11.5pt">，不能在</span><span style="font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">的头进行</span><span style="font-size: 11.5pt">push </span><span style="font-family: 宋体; font-size: 11.5pt">和</span><span style="font-size: 11.5pt">pop </span><span style="font-family: 宋体; font-size: 11.5pt">。 </span></p>
<p><span style="font-size: 11.5pt">(6) </span><span style="font-family: 宋体; font-size: 11.5pt">当动态添加的数据超过</span><span style="font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">默认分配的大小时要进行内存的重新分配、拷贝与释放，这个操作非常消耗性能。 所以要</span><span style="font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">达到最优的性能，最好在创建</span><span style="font-size: 11.5pt">vector </span><span style="font-family: 宋体; font-size: 11.5pt">时就指定其空间大小。 </span></p>
<p align="left"><span style="font-size: 11.5pt">Vectors </span><span style="font-family: 宋体; font-size: 11.5pt">包含着一系列连续存储的元素</span><span style="font-size: 11.5pt">,</span><span style="font-family: 宋体; font-size: 11.5pt">其行为和数组类似。访问</span><span style="font-size: 11.5pt">Vector</span><span style="font-family: 宋体; font-size: 11.5pt">中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成，而查找特定值的元素所处的位置或是在</span><span style="font-size: 11.5pt">Vector</span><span style="font-family: 宋体; font-size: 11.5pt">中插入元素则是线性时间复杂度。</span></p>
<p align="left">&nbsp;</p>
<p><span style="font-family: 宋体; font-size: 11.5pt">1.Constructors </span><span style="font-family: 宋体; font-size: 11.5pt">构造函数 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">vector&lt;int&gt; v1; //</span><span style="font-family: 宋体; font-size: 11.5pt">构造一个空的vector </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">vector&lt;int&gt; v1( 5, 42 ); //</span><span style="font-family: 宋体; font-size: 11.5pt">构造了一个包含5个值为42的元素的Vector </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">2.Operators </span><span style="font-family: 宋体; font-size: 11.5pt">对vector进行赋值或比较 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">C++ Vectors</span><span style="font-family: 宋体; font-size: 11.5pt">能够使用标准运算符: ==, !=, &lt;=, &gt;=, &lt;, 和 &gt;. </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">要访问vector中的某特定位置的元素可以使用 [] 操作符. </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">两个vectors被认为是相等的,如果: </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">1.</span><span style="font-family: 宋体; font-size: 11.5pt">它们具有相同的容量 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">2.</span><span style="font-family: 宋体; font-size: 11.5pt">所有相同位置的元素相等. </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">vectors</span><span style="font-family: 宋体; font-size: 11.5pt">之间大小的比较是按照词典规则. </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">3.assign() </span><span style="font-family: 宋体; font-size: 11.5pt">对Vector中的元素赋值 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">语法： </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">void assign( input_iterator start, input_iterator end ); </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">// </span><span style="font-family: 宋体; font-size: 11.5pt">将区间[start, end)的元素赋到当前vector </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">void assign( size_type num, const TYPE &amp;val ); </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">// </span><span style="font-family: 宋体; font-size: 11.5pt">赋num个值为val的元素到vector中,这个函数将会清除掉为vector赋值以前的内容。</span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">4.at() </span><span style="font-family: 宋体; font-size: 11.5pt">返回指定位置的元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">语法： </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">TYPE at( size_type loc );//</span><span style="font-family: 宋体; font-size: 11.5pt">差不多等同v[i];但比v[i]安全;</span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">5.back() </span><span style="font-family: 宋体; font-size: 11.5pt">返回最末一个元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">6.begin() </span><span style="font-family: 宋体; font-size: 11.5pt">返回第一个元素的迭代器 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">7.capacity() </span><span style="font-family: 宋体; font-size: 11.5pt">返回vector所能容纳的元素数量(在不重新分配内存的情况下） </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">8.clear() </span><span style="font-family: 宋体; font-size: 11.5pt">清空所有元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">9.empty() </span><span style="font-family: 宋体; font-size: 11.5pt">判断Vector是否为空（返回true时为空） </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">10.end() </span><span style="font-family: 宋体; font-size: 11.5pt">返回最末元素的迭代器(译注:实指向最末元素的下一个位置) </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">11.erase() </span><span style="font-family: 宋体; font-size: 11.5pt">删除指定元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">语法： </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">iterator erase( iterator loc );//</span><span style="font-family: 宋体; font-size: 11.5pt">删除loc处的元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">iterator erase( iterator start, iterator end );//</span><span style="font-family: 宋体; font-size: 11.5pt">删除start和end之间的元素</span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">12.front() </span><span style="font-family: 宋体; font-size: 11.5pt">返回第一个元素的引用 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">13.get_allocator() </span><span style="font-family: 宋体; font-size: 11.5pt">返回vector的内存分配器 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">14.insert() </span><span style="font-family: 宋体; font-size: 11.5pt">插入元素到Vector中 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">语法： </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">iterator insert( iterator loc, const TYPE &amp;val ); </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">//</span><span style="font-family: 宋体; font-size: 11.5pt">在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器, </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">void insert( iterator loc, size_type num, const TYPE &amp;val ); </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">//</span><span style="font-family: 宋体; font-size: 11.5pt">在指定位置loc前插入num个值为val的元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">void insert( iterator loc, input_iterator start, input_iterator end ); </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">//</span><span style="font-family: 宋体; font-size: 11.5pt">在指定位置loc前插入区间[start, end)的所有元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">15.max_size() </span><span style="font-family: 宋体; font-size: 11.5pt">返回Vector所能容纳元素的最大数量（上限） </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">16.pop_back() </span><span style="font-family: 宋体; font-size: 11.5pt">移除最后一个元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">17.push_back() </span><span style="font-family: 宋体; font-size: 11.5pt">在Vector最后添加一个元素 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">18.rbegin() </span><span style="font-family: 宋体; font-size: 11.5pt">返回Vector尾部的逆迭代器 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">19.rend() </span><span style="font-family: 宋体; font-size: 11.5pt">返回Vector起始的逆迭代器</span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">20.reserve() </span><span style="font-family: 宋体; font-size: 11.5pt">设置Vector最小的元素容纳数量 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">//</span><span style="font-family: 宋体; font-size: 11.5pt">为当前vector预留至少共容纳size个元素的空间 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">21.resize() </span><span style="font-family: 宋体; font-size: 11.5pt">改变Vector元素数量的大小 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">语法: </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">void resize( size_type size, TYPE val ); </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">//</span><span style="font-family: 宋体; font-size: 11.5pt">改变当前vector的大小为size,且对新创建的元素赋值val </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">22.size() </span><span style="font-family: 宋体; font-size: 11.5pt">返回Vector元素数量的大小 </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">23.swap() </span><span style="font-family: 宋体; font-size: 11.5pt">交换两个Vector </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">语法： </span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">void swap( vector &amp;from );</span></p>
<p>&nbsp;</p>
<p style="text-justify: inter-ideograph"><strong><span style="font-family: 宋体; font-size: 11.5pt">&nbsp;</span></strong><strong><span style="font-family: 宋体; font-size: 16pt">Vector</span></strong><strong><span style="font-family: 宋体; font-size: 16pt">用法 ：</span></strong></p>
<p style="text-justify: inter-ideograph"><span style="font-family: 宋体; font-size: 11.5pt">1.</span><span style="font-family: 宋体; font-size: 11.5pt">声明： </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">一个vector类似于一个动态的一维数组。</span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">vector&lt;int&gt; a; //</span><span style="font-family: 宋体; font-size: 11.5pt">声明一个元素为int类型的vector a </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.3pt"><span style="font-family: 宋体; font-size: 11.5pt">vectot&lt;MyType&gt; a; //</span><span style="font-family: 宋体; font-size: 11.5pt">声明一个元素为MyType类型的vector a </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">这里的声明的a包含0个元素，既a.size()的值为0，但它是动态的，其大小会随着数据的插入和删除改变而改变。</span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">vector&lt;int&gt; a(100, 0); //</span><span style="font-family: 宋体; font-size: 11.5pt">这里声明的是一个已经存放了100个0的整数vector </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">你可以用以下的几种方法声明一个 vector 对象：</span></p>
<p style="text-align: left; text-indent: 17.25pt" align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;float&gt; v(5, 3.25); //</span><span style="font-family: 宋体; color: black; font-size: 11.5pt">初始化有5 个元素，其值都是3.25</span></p>
<p style="text-align: left; text-indent: 17.25pt" align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;float&gt; v_new1(v);</span></p>
<p style="text-align: left; text-indent: 17.25pt" align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;float&gt; v_new2 = v;</span></p>
<p style="text-align: left; text-indent: 17.25pt" align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;float&gt; v_new3(v.begin(), v.end());</span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">这四个vector 对象是相等的，可以用operator==来判断。</span></p>
<p style="text-justify: inter-ideograph"><span style="font-family: 宋体; font-size: 11.5pt">2.</span><span style="font-family: 宋体; font-size: 11.5pt">向量操作</span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 21pt"><span style="font-family: 宋体; font-size: 11.5pt">常用函数： </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">size_t size(); // </span><span style="font-family: 宋体; font-size: 11.5pt">返回vector的大小，即包含的元素个数 </span></p>
<p style="text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">void pop_back(); // </span><span style="font-family: 宋体; font-size: 11.5pt">删除vector末尾的元素，vector大小相应减一</span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">void push_back(); //</span><span style="font-family: 宋体; font-size: 11.5pt">用于在vector的末尾添加元素 </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">T back(); // </span><span style="font-family: 宋体; font-size: 11.5pt">返回vector末尾的元素 </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">void clear(); // </span><span style="font-family: 宋体; font-size: 11.5pt">将vector清空，vector大小变为0 </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 21pt"><span style="font-family: 宋体; font-size: 11.5pt">其他访问方式： </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">cout&lt;&lt;a[5]&lt;&lt;endl; </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">cout&lt;&lt;a.at(5)&lt;&lt;endl; </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 21pt"><span style="font-family: 宋体; font-size: 11.5pt">以上区别在于后者在访问越界时会抛出异常，而前者不会。</span></p>
<p style="text-justify: inter-ideograph"><span style="font-family: 宋体; font-size: 11.5pt">3.</span><span style="font-family: 宋体; font-size: 11.5pt">遍历 </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">(1). for(vector&lt;datatype&gt;::iterator it=a.begin(); it!=a.end();it++) </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 46pt"><span style="font-family: 宋体; font-size: 11.5pt">cout&lt;&lt;*it&lt;&lt;endl; </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 17.25pt"><span style="font-family: 宋体; font-size: 11.5pt">(2). for(int i=0;i&lt;a.size;i++) </span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 43.95pt"><span style="font-family: 宋体; font-size: 11.5pt">cout&lt;&lt;a[i]&lt;&lt;endl;</span></p>
<p style="text-justify: inter-ideograph; text-align: justify; text-indent: 21pt">&nbsp;</p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">现在想得到容器中能保存的最大元素数量就可以用 vector 类的成员函数max_size()：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;shape&gt;::size_type max_size = my_shapes.max_size();</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">当前容器的实际尺寸 --- 已有的元素个数用size()：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;shape&gt;::size_type size = my_shapes.size();</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">就像size_type 描述了vector 尺寸的类型，value_type 说明了其中保存的对象的类型：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">cout &lt;&lt; &#8220;value type: &#8220; &lt;&lt; typeid(vector&lt;float&gt;::value_type).name();</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">输出：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">value type: float</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">可以用capacity()来取得vector 中已分配内存的元素个数：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;int&gt; v;</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;int&gt;::size_type capacity = v.capacity();</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector </span><span style="font-family: 宋体; color: black; font-size: 11.5pt">类似于数组，可以使用下标[]访问：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;int&gt; v(10);</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">v[0] = 101;</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">注意到这里预先给10 个元素分配了空间。你也可以使用vector 提供的插入函数来动态的扩</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">展容器。成员函数push_back()就在vector 的尾部添加了一个元素：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">v.push_back(3);</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">也可以用insert()函数完成同样的工作：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">v.insert(v.end(), 3);</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">这里insert()成员函数需要两个参数：一个指向容器中指定位置的迭代器(iterator)，一个待插</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">入的元素。insert()将元素插入到迭代器指定元素之前。</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">现在对迭代器(Iterator)做点解释。Iterator 是指针(pointer)的泛化，iterator 要求定义</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">operator*</span><span style="font-family: 宋体; color: black; font-size: 11.5pt">，它返回指定类型的值。Iterator 常常和容器联系在一起。例子：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;int&gt; v(3);</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">v[0] = 5;</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">v[1] = 2;</span></p>
<p style="text-justify: inter-ideograph"><span style="font-family: 宋体; font-size: 11.5pt">v[2] = 7;</span></p>
<p style="text-justify: inter-ideograph">&nbsp;</p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;int&gt;::iterator first = v.begin();</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">vector&lt;int&gt;::iterator last = v.end();</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">while (first != last)</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">cout &lt;&lt; *first++ &lt;&lt; &#8220; &#8220;;</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">上面代码的输出是：</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">5 2 7</span></p>
<p align="left"><span style="font-family: 宋体; color: black; font-size: 11.5pt">begin()</span><span style="font-family: 宋体; color: black; font-size: 11.5pt">返回的是vector 中第一个元素的iterator，而end()返回的并不是最后一个元素的</span></p>
<p><span style="font-family: 宋体; font-size: 11.5pt">iterator</span><span style="font-family: 宋体; font-size: 11.5pt">，而是past the last element。在STL 中叫past-the-end iterator</span><span style="font-family: 宋体;">。<br /><br /></span><span style="font-family: 宋体; color: red;">组合查找</span><span style="font-family: 宋体;"><br /></span><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">vector&lt;int&gt;::iterator result = find(&nbsp;</span><span style="font-family: 宋体; font-size: 15px;">v</span><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">.begin( ),&nbsp;</span><span style="font-family: 宋体; font-size: 15px;">v</span><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">.end( ), 2 ); //查找2<br /></span><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">if ( result == v.end( ) ) //没找到</span><br style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "No" &lt;&lt; endl;</span><br style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;else //找到</span><br style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Yes" &lt;&lt; endl;</span><br style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: 宋体;"><br /></span></p></div><span style="font-family: 宋体; color: black; font-size: 10.5pt"><br clear="all" /></span>
<p>&nbsp;</p><img src ="http://www.cppblog.com/wanghaiguang/aggbug/177416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-04 09:18 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL介绍</title><link>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177412.html</link><dc:creator>王海光</dc:creator><author>王海光</author><pubDate>Mon, 04 Jun 2012 00:52:00 GMT</pubDate><guid>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177412.html</guid><wfw:comment>http://www.cppblog.com/wanghaiguang/comments/177412.html</wfw:comment><comments>http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/wanghaiguang/comments/commentRss/177412.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/wanghaiguang/services/trackbacks/177412.html</trackback:ping><description><![CDATA[<div style="text-indent: 23pt"><span style="font-family: 宋体; font-size: 12pt"><br /><strong>STL介绍<br /></strong>&nbsp;&nbsp;&nbsp; C++ STL (Standard Template Library</span><span style="font-family: 宋体; font-size: 12pt">标准模板库</span><span style="font-family: 宋体; font-size: 12pt">) </span><span style="font-family: 宋体; font-size: 12pt">是通用类模板和算法的集合，它提供给程序员一些标准的数据结构的实现如 </span><span style="font-family: 宋体; font-size: 12pt">queues(</span><span style="font-family: 宋体; font-size: 12pt">队列</span><span style="font-family: 宋体; font-size: 12pt">), lists(</span><span style="font-family: 宋体; font-size: 12pt">链表</span><span style="font-family: 宋体; font-size: 12pt">), </span><span style="font-family: 宋体; font-size: 12pt">和 </span><span style="font-family: 宋体; font-size: 12pt">stacks(</span><span style="font-family: 宋体; font-size: 12pt">栈</span><span style="font-family: 宋体; font-size: 12pt">)</span><span style="font-family: 宋体; font-size: 12pt">等</span><span style="font-family: 宋体; font-size: 12pt">.</span> <span style="font-family: 宋体; font-size: 12pt">该库包含了诸多在计算机<a href="http://tech.163.com/discover/"><span style="color: windowtext; text-decoration: none; text-underline: none"><span style="font-size: 12pt">科学</span></a></span></span><span style="font-family: 宋体; font-size: 10pt"><span style="color: windowtext; text-decoration: none; text-underline: none"></span></span><span style="font-family: 宋体; font-size: 12pt">领域里所常用的基本数据结构和基本算法。提供了一个可扩展的应用框架，高度体现了软件的可复用性。</span></div>
<div style="text-indent: 23pt"><span style="font-family: 宋体; font-size: 12pt">从逻辑层次来看，在STL中体现了泛型化程序设计的思想（generic programming），引入了诸多新的名词，比如像需求（requirements），概念（concept），模型（model），容器（container），算法（algorithmn），迭代子（iterator）等。与OOP（object-oriented programming）中的多态（polymorphism）一样，泛型也是一种软件的复用技术。</span></div>
<div style="text-indent: 23pt"><span style="font-family: 宋体; font-size: 12pt">从实现层次看，整个STL是以一种类型参数化（type parameterized）的方式实现的，这种方式基于一个在早先C++标准中没有出现的语言特性--模板（template）。<br /></span></div>
<div><span style="font-family: 宋体; font-size: 12pt"><strong>C++ STL </strong></span><span style="font-family: 宋体; font-size: 12pt"><strong>提供给程序员以下三类数据结构的实现</strong>： </span></div>
<div><span style="font-family: 宋体; font-size: 12pt"><strong>标准容器类<br />&nbsp;<br /></strong></span></div>
<div><span style="font-family: 宋体; font-size: 12pt"><strong>顺序性容器</strong><br /></span></div>
<div><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;vector </span><span style="font-family: 宋体; font-size: 12pt">从后面快速的插入与删除，直接访问任何元素 </span></div>
<div><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;deque </span><span style="font-family: 宋体; font-size: 12pt">从前面或后面快速的插入与删除，直接访问任何元素 </span></div>
<div><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;list </span><span style="font-family: 宋体; font-size: 12pt">双链表，从任何地方快速插入与删除<br />&nbsp;<br /><strong>三者比较：<br /></strong>&nbsp;&nbsp;&nbsp;vector 是一段连续的内存块，而deque 是多个连续的内存块， list 是所有数据元素分开保存，可以是任何两个元素没有连续。vector 的查询性能最好，并且在末端增加数据也很好，除非它重新申请内存段；适合高效地随机存储。list 是一个链表，任何一个元素都可以是不连续的，但它都有两个指向上一元素和下一元素的指针。所以它对插入、删除元素性能是最好的，而查询性能非常差；适合大量地插入和删除操作而不关心随机存取的需求。deque 是介于两者之间，它兼顾了数组和链表的优点，它是分块的链表和多个数组的联合。所以它有被list好的查询性能，有被vector好的插入、删除性能。 如果你需要随即存取又关心两端数据的插入和删除，那么deque是最佳之选。<br /></span></div>
<div><span style="font-family: 宋体; font-size: 12pt"><br /><strong>关联容器</strong> </span></div>
<div><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;set </span><span style="font-family: 宋体; font-size: 12pt">快速查找，不允许重复值 </span></div>
<div><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;multiset </span><span style="font-family: 宋体; font-size: 12pt">快速查找，允许重复值 </span></div>
<div><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;map </span><span style="font-family: 宋体; font-size: 12pt">一对多映射，基于关键字快速查找，不允许重复值 </span></div>
<div><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;multimap </span><span style="font-family: 宋体; font-size: 12pt">一对多映射，基于关键字快速查找，允许重复值<br /><br />&nbsp;&nbsp;&nbsp;关联容器(Associative Container)提供了快速检索基于关键词(Key)的数据的能力。和序列容器(vector、list、deque)一样，关联容器用来存储数据，而且设计关联容器时考虑到了优化数据检索的意图 --- 通过关键词(Key)作为标识把单一的数据记录组织到特定的结构中(如tree)。STL 提供了不同的关联容器：集合(set)、多元集合(multiset)、映射(map)、多元映射(multimap)。set 和map 支持唯一关键词(unique key)，就是对每个KEY，最多只保存一个元素(数据<br />记录)。multiset 和multimap 则支持相同关键词(equal key)，这样可有很多个元素可以用同一个KEY 进行存储。set(multiset)和map(multimap)之间的区别在于set(multiset)中的存储数据内含了KEY 表达式；而map(multimap)则将Key 表达式和对应的数据分开存放。</span></div>
<div align="left"><span style="font-family: 宋体; color: black; font-size: 12pt"><br /><strong>容器适配器</strong> <br /></span></div>
<div align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;stack </span><span style="font-family: 宋体; color: black; font-size: 12pt">后进先出 </span></div>
<div align="left"><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;queue </span><span style="font-family: 宋体; color: black; font-size: 12pt">先进先出 </span></div>
<div><span style="font-family: 宋体; color: black; font-size: 12pt">&nbsp;&nbsp;&nbsp;priority_queue </span><span style="font-family: 宋体; color: black; font-size: 12pt">最高优先级元素总是第一个出列<br /><br />&nbsp;&nbsp;&nbsp;STL 中包含三种适配器：栈stack 、队列queue 和优先级priority_queue 。适配器是容器的接口，它本身不能直接保存元素，它保存元素的机制是调用另一种顺序容器去实现，即可以把适配器看作&#8220;它保存一个容器，这个容器再保存所有元素&#8221;。<br />&nbsp;&nbsp;&nbsp;STL 中提供的三种适配器可以由某一种顺序容器去实现。默认下stack 和queue 基于deque 容器实现，priority_queue 则基于vector 容器实现。当然在创建一个适配器时也可以指定具体的实现容器，创建适配器时在第二个参数上指定具体的顺序容器可以覆盖适配器的默认实现。由于适配器的特点，一个适配器不是可以由任一个顺序容器都可以实现的。<br />&nbsp;&nbsp;&nbsp;栈stack 的特点是后进先出，所以它关联的基本容器可以是任意一种顺序容器，因为这些容器类型结构都可以提供栈的操作有求，它们都提供了push_back 、pop_back 和back 操作。<br />&nbsp;&nbsp;&nbsp;队列queue 的特点是先进先出，适配器要求其关联的基础容器必须提供pop_front 操作，因此其不能建立在vector 容器上。</span></div><img src ="http://www.cppblog.com/wanghaiguang/aggbug/177412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/wanghaiguang/" target="_blank">王海光</a> 2012-06-04 08:52 <a href="http://www.cppblog.com/wanghaiguang/archive/2012/06/04/177412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>