<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[STL中map用法详解]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sun, 11 Apr 2010 03:49:09 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	由于STL是一个统一的整体，map的很多用法都和STL中其它的东西结合在一起；map中由于它内部有序，由红黑树保证，因此很多函数执行的时间复杂度都是log2N的，如果用map函数可以实现的功能，而STL Algorithm也可以完成该功能，建议用map自带函数，效率高一些…… <br/><br/><br/>Map是STL的一个关联容器，它提供一对一（其中第一个可以称为关键字，每个关键字只能在map中出现一次，第二个可能称为该关键字的值）的数据处理能力，由于这个特性，它完成有可能在我们处理一对一数据的时候，在编程上提供快速通道。这里说下map内部数据的组织，map内部自建一颗红黑树(一种非严格意义上的平衡二叉树)，这颗树具有对数据自动排序的功能，所以在map内部所有的数据都是有序的，后边我们会见识到有序的好处。<br/><br/>下面举例说明什么是一对一的数据映射。比如一个班级中，每个学生的学号跟他的姓名就存在着一一映射的关系，这个模型用map可能轻易描述，很明显学号用int描述，姓名用字符串描述(本篇文章中不用char *来描述字符串，而是采用STL中string来描述),下面给出map描述代码：<br/><br/>Map&lt;int, string&gt; mapStudent;<br/><br/>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map的构造函数<br/><br/>map共提供了6个构造函数，这块涉及到内存分配器这些东西，略过不表，在下面我们将接触到一些map的构造方法，这里要说下的就是，我们通常用如下方法构造一个map：<br/><br/>Map&lt;int, string&gt; mapStudent;<br/><br/>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据的插入<br/><br/>在构造map容器后，我们就可以往里面插入数据了。这里讲三种插入数据的方法：<br/><br/>第一种：用insert函数插入pair数据，下面举例说明(以下代码虽然是随手写的，应该可以在VC和GCC下编译通过，大家可以运行下看什么效果，在VC下请加入这条语句，屏蔽4786警告&nbsp;&nbsp;＃pragma warning (disable:4786) )<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(1, “student_one”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(2, “student_two”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(3, “student_three”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::iterator&nbsp;&nbsp;iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;first&lt;&lt;”&nbsp;&nbsp; ”&lt;&lt;iter-&gt;second&lt;&lt;end;<br/><br/>&#125;<br/><br/>&#125;<br/><br/>第二种：用insert函数插入value_type数据，下面举例说明<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(map&lt;int, string&gt;::value_type (1, “student_one”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(map&lt;int, string&gt;::value_type (2, “student_two”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(map&lt;int, string&gt;::value_type (3, “student_three”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::iterator&nbsp;&nbsp;iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;first&lt;&lt;”&nbsp;&nbsp; ”&lt;&lt;iter-&gt;second&lt;&lt;end;<br/><br/>&#125;<br/><br/>&#125;<br/><br/>第三种：用数组方式插入数据，下面举例说明<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[1] =&nbsp;&nbsp;“student_one”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[2] =&nbsp;&nbsp;“student_two”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[3] =&nbsp;&nbsp;“student_three”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::iterator&nbsp;&nbsp;iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;first&lt;&lt;”&nbsp;&nbsp; ”&lt;&lt;iter-&gt;second&lt;&lt;end;<br/><br/>&#125;<br/><br/>&#125;<br/><br/>以上三种用法，虽然都可以实现数据的插入，但是它们是有区别的，当然了第一种和第二种在效果上是完成一样的，用insert函数插入数据，在数据的插入上涉及到集合的唯一性这个概念，即当map中有这个关键字时，insert操作是插入数据不了的，但是用数组方式就不同了，它可以覆盖以前该关键字对应的值，用程序说明<br/><br/>mapStudent.insert(map&lt;int, string&gt;::value_type (1, “student_one”));<br/><br/>mapStudent.insert(map&lt;int, string&gt;::value_type (1, “student_two”));<br/><br/>上面这两条语句执行后，map中1这个关键字对应的值是“student_one”，第二条语句并没有生效，那么这就涉及到我们怎么知道insert语句是否插入成功的问题了，可以用pair来获得是否插入成功，程序如下<br/><br/>Pair&lt;map&lt;int, string&gt;::iterator, bool&gt; Insert_Pair;<br/><br/>Insert_Pair = mapStudent.insert(map&lt;int, string&gt;::value_type (1, “student_one”));<br/><br/>我们通过pair的第二个变量来知道是否插入成功，它的第一个变量返回的是一个map的迭代器，如果插入成功的话Insert_Pair.second应该是true的，否则为false。<br/><br/>下面给出完成代码，演示插入成功与否问题<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>Pair&lt;map&lt;int, string&gt;::iterator, bool&gt; Insert_Pair;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Insert_Pair ＝ mapStudent.insert(pair&lt;int, string&gt;(1, “student_one”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If(Insert_Pair.second == true)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cout&lt;&lt;”Insert Successfully”&lt;&lt;endl;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cout&lt;&lt;”Insert Failure”&lt;&lt;endl;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Insert_Pair ＝ mapStudent.insert(pair&lt;int, string&gt;(1, “student_two”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If(Insert_Pair.second == true)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cout&lt;&lt;”Insert Successfully”&lt;&lt;endl;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cout&lt;&lt;”Insert Failure”&lt;&lt;endl;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::iterator&nbsp;&nbsp;iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;first&lt;&lt;”&nbsp;&nbsp; ”&lt;&lt;iter-&gt;second&lt;&lt;end;<br/><br/>&#125;<br/><br/>&#125;<br/><br/>大家可以用如下程序，看下用数组插入在数据覆盖上的效果<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[1] =&nbsp;&nbsp;“student_one”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[1] =&nbsp;&nbsp;“student_two”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[2] =&nbsp;&nbsp;“student_three”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::iterator&nbsp;&nbsp;iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;first&lt;&lt;”&nbsp;&nbsp; ”&lt;&lt;iter-&gt;second&lt;&lt;end;<br/><br/>&#125;<br/><br/>&#125;<br/><br/>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map的大小<br/><br/>在往map里面插入了数据，我们怎么知道当前已经插入了多少数据呢，可以用size函数，用法如下：<br/><br/>Int nSize = mapStudent.size();<br/><br/>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据的遍历<br/><br/>这里也提供三种方法，对map进行遍历<br/><br/>第一种：应用前向迭代器，上面举例程序中到处都是了，略过不表<br/><br/>第二种：应用反相迭代器，下面举例说明，要体会效果，请自个动手运行程序<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(1, “student_one”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(2, “student_two”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(3, “student_three”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::reverse_iterator&nbsp;&nbsp;iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(iter = mapStudent.rbegin(); iter != mapStudent.rend(); iter++)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;first&lt;&lt;”&nbsp;&nbsp; ”&lt;&lt;iter-&gt;second&lt;&lt;end;<br/><br/>&#125;<br/><br/>&#125;<br/><br/>第三种：用数组方式，程序说明如下<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(1, “student_one”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(2, “student_two”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(3, “student_three”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nSize = mapStudent.size()<br/><br/>//此处有误，应该是 for(int nIndex = 1; nIndex &lt;= nSize; nIndex++) <br/><br/><br/>//by rainfish<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int nIndex = 0; nIndex &lt; nSize; nIndex++)<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;mapStudent[nIndex]&lt;&lt;end;<br/><br/>&#125;<br/><br/>&#125;<br/><br/>5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据的查找（包括判定这个关键字是否在map中出现）<br/><br/>在这里我们将体会，map在数据插入时保证有序的好处。<br/><br/>要判定一个数据（关键字）是否在map中出现的方法比较多，这里标题虽然是数据的查找，在这里将穿插着大量的map基本用法。<br/><br/>这里给出三种数据查找方法<br/><br/>第一种：用count函数来判定关键字是否出现，其缺点是无法定位数据出现位置,由于map的特性，一对一的映射关系，就决定了count函数的返回值只有两个，要么是0，要么是1，出现的情况，当然是返回1了<br/><br/>第二种：用find函数来定位数据出现位置，它返回的一个迭代器，当数据出现时，它返回数据所在位置的迭代器，如果map中没有要查找的数据，它返回的迭代器等于end函数返回的迭代器，程序说明<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(1, “student_one”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(2, “student_two”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(3, “student_three”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::iterator iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iter = mapStudent.find(1);<br/><br/>if(iter != mapStudent.end())<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;”Find, the value is ”&lt;&lt;iter-&gt;second&lt;&lt;endl;<br/><br/>&#125;<br/><br/>Else<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;”Do not Find”&lt;&lt;endl;<br/><br/>&#125;<br/><br/>&#125;<br/><br/>第三种：这个方法用来判定数据是否出现，是显得笨了点，但是，我打算在这里讲解<br/><br/>Lower_bound函数用法，这个函数用来返回要查找关键字的下界(是一个迭代器)<br/><br/>Upper_bound函数用法，这个函数用来返回要查找关键字的上界(是一个迭代器)<br/><br/>例如：map中已经插入了1，2，3，4的话，如果lower_bound(2)的话，返回的2，而upper-bound（2）的话，返回的就是3<br/><br/>Equal_range函数返回一个pair，pair里面第一个变量是Lower_bound返回的迭代器，pair里面第二个迭代器是Upper_bound返回的迭代器，如果这两个迭代器相等的话，则说明map中不出现这个关键字，程序说明<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[1] =&nbsp;&nbsp;“student_one”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[3] =&nbsp;&nbsp;“student_three”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent[5] =&nbsp;&nbsp;“student_five”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::iterator&nbsp;&nbsp;iter;<br/><br/>iter = mapStudent.lower_bound(2);<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回的是下界3的迭代器<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;second&lt;&lt;endl;<br/><br/>&#125;<br/><br/>iter = mapStudent.lower_bound(3);<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回的是下界3的迭代器<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;second&lt;&lt;endl;<br/><br/>&#125;<br/><br/> <br/><br/>iter = mapStudent.upper_bound(2);<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回的是上界3的迭代器<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;second&lt;&lt;endl;<br/><br/>&#125;<br/><br/>iter = mapStudent.upper_bound(3);<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回的是上界5的迭代器<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cout&lt;&lt;iter-&gt;second&lt;&lt;endl;<br/><br/>&#125;<br/><br/> <br/><br/>Pair&lt;map&lt;int, string&gt;::iterator, map&lt;int, string&gt;::iterator&gt; mapPair;<br/><br/>mapPair = mapStudent.equal_range(2);<br/><br/>if(mapPair.first == mapPair.second)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;”Do not Find”&lt;&lt;endl;<br/><br/>&#125;<br/><br/>Else<br/><br/>&#123;<br/><br/>Cout&lt;&lt;”Find”&lt;&lt;endl;<br/>&#125;<br/><br/>mapPair = mapStudent.equal_range(3);<br/><br/>if(mapPair.first == mapPair.second)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout&lt;&lt;”Do not Find”&lt;&lt;endl;<br/><br/>&#125;<br/><br/>Else<br/><br/>&#123;<br/><br/>Cout&lt;&lt;”Find”&lt;&lt;endl;<br/>&#125;<br/><br/>&#125;<br/><br/>6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据的清空与判空<br/><br/>清空map中的数据可以用clear()函数，判定map中是否有数据可以用empty()函数，它返回true则说明是空map<br/><br/>7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据的删除<br/><br/>这里要用到erase函数，它有三个重载了的函数，下面在例子中详细说明它们的用法<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>#include &lt;iostream&gt;<br/><br/>Using namespace std;<br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;int, string&gt; mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(1, “student_one”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(2, “student_two”));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;int, string&gt;(3, “student_three”));<br/><br/> <br/><br/>//如果你要演示输出效果，请选择以下的一种，你看到的效果会比较好<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果要删除1,用迭代器删除<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;int, string&gt;::iterator iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iter = mapStudent.find(1);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.erase(iter);<br/><br/> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果要删除1，用关键字删除<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Int n = mapStudent.erase(1);//如果删除了会返回1，否则返回0<br/><br/> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用迭代器，成片的删除<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //一下代码把整个map清空<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.earse(mapStudent.begin(), mapStudent.end());<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //成片删除要注意的是，也是STL的特性，删除区间是一个前闭后开的集合<br/><br/> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //自个加上遍历代码，打印输出吧<br/><br/>&#125;<br/><br/>8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其他一些函数用法<br/><br/>这里有swap,key_comp,value_comp,get_allocator等函数，感觉到这些函数在编程用的不是很多，略过不表，有兴趣的话可以自个研究<br/><br/>9.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 排序<br/><br/>这里要讲的是一点比较高深的用法了,排序问题，STL中默认是采用小于号来排序的，以上代码在排序上是不存在任何问题的，因为上面的关键字是int型，它本身支持小于号运算，在一些特殊情况，比如关键字是一个结构体，涉及到排序就会出现问题，因为它没有小于号操作，insert等函数在编译的时候过不去，下面给出两个方法解决这个问题<br/><br/>第一种：小于号重载，程序举例<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>Using namespace std;<br/><br/>Typedef struct tagStudentInfo<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nID;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; strName;<br/><br/>&#125;StudentInfo, *PStudentInfo;&nbsp;&nbsp;//学生信息<br/><br/> <br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;int nSize;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用学生信息映射分数<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;StudentInfo, int&gt;mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;map&lt;StudentInfo, int&gt;::iterator iter;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StudentInfo studentInfo;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentInfo.nID = 1;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentInfo.strName = “student_one”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;StudentInfo, int&gt;(studentInfo, 90));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentInfo.nID = 2;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentInfo.strName = “student_two”;<br/><br/>mapStudent.insert(pair&lt;StudentInfo, int&gt;(studentInfo, 80));<br/><br/> <br/><br/>for (iter=mapStudent.begin(); iter!=mapStudent.end(); iter++)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;iter-&gt;first.nID&lt;&lt;endl&lt;&lt;iter-&gt;first.strName&lt;&lt;endl&lt;&lt;iter-&gt;second&lt;&lt;endl;<br/><br/> <br/><br/>&#125;<br/><br/>以上程序是无法编译通过的，只要重载小于号，就OK了，如下：<br/><br/>Typedef struct tagStudentInfo<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nID;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; strName;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bool operator &lt; (tagStudentInfo const&amp; _A) const<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这个函数指定排序策略，按nID排序，如果nID相等的话，按strName排序<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If(nID &lt; _A.nID)&nbsp;&nbsp;return true;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If(nID == _A.nID) return strName.compare(_A.strName) &lt; 0;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Return false;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&#125;StudentInfo, *PStudentInfo;&nbsp;&nbsp;//学生信息<br/><br/>第二种：仿函数的应用，这个时候结构体中没有直接的小于号重载，程序说明<br/><br/>#include &lt;map&gt;<br/><br/>#include &lt;string&gt;<br/><br/>Using namespace std;<br/><br/>Typedef struct tagStudentInfo<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nID;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp; strName;<br/><br/>&#125;StudentInfo, *PStudentInfo;&nbsp;&nbsp;//学生信息<br/><br/> <br/><br/>Classs sort<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Public:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bool operator() (StudentInfo const &amp;_A, StudentInfo const &amp;_B) const<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If(_A.nID &lt; _B.nID) return true;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If(_A.nID == _B.nID) return _A.strName.compare(_B.strName) &lt; 0;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Return false;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/><br/>&#125;;<br/><br/> <br/><br/>Int main()<br/><br/>&#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用学生信息映射分数<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;StudentInfo, int, sort&gt;mapStudent;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StudentInfo studentInfo;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentInfo.nID = 1;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentInfo.strName = “student_one”;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mapStudent.insert(pair&lt;StudentInfo, int&gt;(studentInfo, 90));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentInfo.nID = 2;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; studentInfo.strName = “student_two”;<br/><br/>mapStudent.insert(pair&lt;StudentInfo, int&gt;(studentInfo, 80));<br/><br/>&#125;<br/><br/>10.&nbsp;&nbsp; 另外<br/><br/>由于STL是一个统一的整体，map的很多用法都和STL中其它的东西结合在一起，比如在排序上，这里默认用的是小于号，即less&lt;&gt;，如果要从大到小排序呢，这里涉及到的东西很多，在此无法一一加以说明。<br/><br/>还要说明的是，map中由于它内部有序，由红黑树保证，因此很多函数执行的时间复杂度都是log2N的，如果用map函数可以实现的功能，而STL&nbsp;&nbsp;Algorithm也可以完成该功能，建议用map自带函数，效率高一些。<br/><br/>下面说下，map在空间上的特性，否则，估计你用起来会有时候表现的比较郁闷，由于map的每个数据对应红黑树上的一个节点，这个节点在不保存你的数据时，是占用16个字节的，一个父节点指针，左右孩子指针，还有一个枚举值（标示红黑的，相当于平衡二叉树中的平衡因子），我想大家应该知道，这些地方很费内存了吧，不说了……<br/><br/>来源：http://www.kuqin.com/cpluspluslib/20071231/3265.html<br/>参考：http://hi.baidu.com/blackstar08/blog/item/a385507619bd9a15b051b9ac.html
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] STL中map用法详解]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>