﻿<?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++博客-VC++多一分钟学习，早一分钟提高-随笔分类-C++ Map</title><link>http://www.cppblog.com/xkjy3000/category/19529.html</link><description>VC++、C++、Socket、DirectUI</description><language>zh-cn</language><lastBuildDate>Sun, 24 Jun 2012 17:12:55 GMT</lastBuildDate><pubDate>Sun, 24 Jun 2012 17:12:55 GMT</pubDate><ttl>60</ttl><item><title>STL map常用操作简介</title><link>http://www.cppblog.com/xkjy3000/archive/2012/06/20/179518.html</link><dc:creator>虚空骄阳</dc:creator><author>虚空骄阳</author><pubDate>Wed, 20 Jun 2012 08:55:00 GMT</pubDate><guid>http://www.cppblog.com/xkjy3000/archive/2012/06/20/179518.html</guid><wfw:comment>http://www.cppblog.com/xkjy3000/comments/179518.html</wfw:comment><comments>http://www.cppblog.com/xkjy3000/archive/2012/06/20/179518.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xkjy3000/comments/commentRss/179518.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xkjy3000/services/trackbacks/179518.html</trackback:ping><description><![CDATA[<p><strong>1。目录 </strong></p>
<ol><li>map简介</li><li>map的功能</li><li>使用map</li><li>在map中插入元素</li><li>查找并获取map中的元素</li><li>从map中删除元素 </li></ol>
<p><strong>2。map简介 </strong></p>
<p>map是一类<span style="color: red">关联式容器</span>。它的特点是<span style="color: #9bbb59">增加和删除节点对迭代器的影响很小</span>，除了那个操作节点，对其他的节点都没有什么影响。对于迭代器来说，可以修改实值，而不能修改key。 </p>
<p><strong>3。map的功能 </strong></p>
<ol><li>自动建立Key － value的对应。key 和 value可以是任意你需要的类型。</li><li>根据key值快速查找记录，查找的复杂度基本是Log(N)，如果有1000个记录，最多查找10次，1,000,000个记录，最多查找20次。</li><li>快速插入Key - Value 记录。</li><li>快速删除记录</li><li>根据Key 修改value记录。</li><li>遍历所有记录。 </li></ol>
<p><strong>4。使用map </strong></p>
<p>使用map得包含map类所在的头文件<br />#include &lt;map&gt; //注意，STL头文件没有扩展名.h </p>
<p>map对象是模板类，需要关键字和存储对象两个模板参数：<br />std:map&lt;int, string&gt; personnel;<br />这样就定义了一个用int作为索引,并拥有相关联的指向string的指针. </p>
<p>为了使用方便，可以对模板类进行一下类型定义， </p>
<p style="margin-left: 11pt">typedef map&lt;int, CString&gt; UDT_MAP_INT_CSTRING; <br />UDT_MAP_INT_CSTRING enumMap; </p>
<p><strong>5。在map中插入元素 </strong></p>
<p>改变map中的条目非常简单，因为map类已经对[]操作符进行了重载 </p>
<p style="margin-left: 11pt">enumMap[1] = "One";<br />enumMap[2] = "Two";<br />..... </p>
<p>这样非常直观，但存在一个性能的问题。<span style="color: #9bbb59">插入2时,先在enumMap中查找主键为2的项，没发现，然后将一个新的对象插入enumMap，键是2，值是一个空字符串，插入完成后，将字符串赋为"Two"</span>; 该方法会将每个值都赋为缺省值，然后再赋为显示的值，如果元素是类对象，则开销比较大。我们可以用以下方法来避免开销： </p>
<p style="margin-left: 11pt">enumMap.<span style="color: #f79646">insert</span>(map&lt;int, CString&gt; :: value_type(2, "Two")) </p>
<p><strong>6。查找并获取map中的元素 </strong></p>
<p>下标操作符给出了获得一个值的最简单方法： </p>
<p style="margin-left: 11pt">CString tmp = enumMap[2]; </p>
<p>但是,<span style="color: #948a54">只有当map中有这个键的实例时才对</span>，否则会自动插<span style="color: #548dd4">入一个实例，值为初始化值</span>。 </p>
<p>我们可以使用Find()和Count()方法来发现一个键是否存在。 </p>
<p>查找map中是否包含某个关键字条目用<span style="color: #f79646">find()</span>方法，传入的参数是要查找的key，在这里需要提到的是begin()和end()两个成员，分别代表map对象中第一个条目和最后一个条目，这两个数据的类型是iterator. </p>
<p style="margin-left: 11pt">int nFindKey = 2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//要查找的Key<br />//定义一个条目变量(实际是指针)<br />UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);&nbsp;<br />if(it == enumMap.end()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;//没找到<br />}<br />else {<br />&nbsp;&nbsp;&nbsp;&nbsp;//找到<br />} </p>
<p>通过map对象的方法获取的iterator数据类型是一个std::pair对象，包括两个数据 iterator-&gt;first 和 iterator-&gt;second 分别代表关键字和存储的数据 </p>
<p><strong>7。从map中删除元素 </strong></p>
<p>移除某个map中某个条目用<span style="color: #f79646">erase()</span> </p>
<p>该成员方法的定义如下 </p>
<ol><li>iterator erase(iterator it); //通过一个条目对象删除</li><li>iterator erase(iterator first, iterator last);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//删除一个范围</li><li>size_type erase(const Key&amp; key); //通过关键字删除 </li></ol>
<p><span style="color: #f79646">clear()</span>就相当于 enumMap.erase(enumMap.begin(), enumMap.end()); </p>    <img src ="http://www.cppblog.com/xkjy3000/aggbug/179518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xkjy3000/" target="_blank">虚空骄阳</a> 2012-06-20 16:55 <a href="http://www.cppblog.com/xkjy3000/archive/2012/06/20/179518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CArray,CMap,CList 速度比较</title><link>http://www.cppblog.com/xkjy3000/archive/2012/06/20/179510.html</link><dc:creator>虚空骄阳</dc:creator><author>虚空骄阳</author><pubDate>Wed, 20 Jun 2012 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/xkjy3000/archive/2012/06/20/179510.html</guid><wfw:comment>http://www.cppblog.com/xkjy3000/comments/179510.html</wfw:comment><comments>http://www.cppblog.com/xkjy3000/archive/2012/06/20/179510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/xkjy3000/comments/commentRss/179510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/xkjy3000/services/trackbacks/179510.html</trackback:ping><description><![CDATA[<span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">
<p><span style="color: rgb(255,0,0)"><strong><span style="font-size: large">CArray：增加元素非常快, 查询元素慢(循环方式)</span></strong></span></p>
<p><span style="color: rgb(255,0,0)"><strong><span style="font-size: large">CMap：增加元素很慢,查询元素非常快(<font style="background-color: #ffd700"><span style="background-color: #ffffff">Lookup</span></font>方法)【</span></strong></span><span style="color: rgb(255,0,0)"><strong><span style="font-size: large">随机地频繁地访问元素时,建议使用CMAP】<br /><font face="宋体"><span style="color: red">CList：插入删除很快</span>。<span style="color: red">但是通过索引访问很慢</span></font></span></strong></span></p></span><br /><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">
<p><strong><span style="font-family: 'Times New Roman'; color: #000000; font-size: 14pt" lang="EN-US">1.<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体; color: red; font-size: 14pt">数组</span><span style="font-family: 'Times New Roman'; color: red; font-size: 14pt" lang="EN-US">--CArray</span></strong><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br />&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体; font-size: 10.5pt">访问方法及效率和普通的数组一样，比普通数组强大的功能是<span style="color: red">可以改变数组的大小</span>。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br /></span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;&nbsp; Array采用<span style="color: rgb(255,0,0)">队列方式存</span>储数据，因而其内部数据元素是以物理方式顺序排列的， 所以检索、顺序执行GetAt()等函数的速度是相当快的。但是由于每次队列长度变化后，数据都要重新申请内存、拷贝内存、释放内存，因而 Insert/Add/RemoveAt()的速度都很慢。如果你使用的数据元素尺寸相当大，而且数组的操作相当复杂，频繁使用InsertAt /SetAt/RemoveAt等，应该考虑使用CList来代替。但是如果考虑Array中存储指针而不是数据本身，效率也可以接受。</span><br /><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体; font-size: 10.5pt">特点：通过索引</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">(</span><span style="font-family: 宋体; font-size: 10.5pt">数组下标</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">)</span><span style="font-family: 宋体; color: red; font-size: 10.5pt">访问的速度很快</span><span style="font-family: 宋体; font-size: 10.5pt">，但是<span style="color: red">插入删除操作很慢</span>，因为插入删除操作时，是需要移动元素的。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br />&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体; font-size: 10.5pt">访问方法：通过索引访问，普通的数组怎么用，它就可以怎么用。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br /></span></p>
<h1 style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px"><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: normal" lang="EN-US">MFC</span><span style="font-size: 10.5pt; font-weight: normal">数组类</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt; font-weight: normal" lang="EN-US">CArray</span><span style="font-size: 10.5pt; font-weight: normal">的使用的操作详解</span></h1>
<p style="text-align: left" align="left"><span lang="EN-US">MFC</span><span style="font-family: 宋体">的数组类支持的数组类似于常规数组，可以存放任何数据类型。常规数组在使用前必须将其定义成能够容纳所有可能需要的元素，即先确定大小，而</span><span lang="EN-US">MFC</span><span style="font-family: 宋体">数组类创建的对象可以根据需要动态地增大或减小，数组的起始下标是</span><span lang="EN-US">0</span><span style="font-family: 宋体">，而<span style="color: rgb(255,0,0)">上限可以是固定的，也可以随着元素的增加而增加，</span>数组在内存中的地址仍然是连续分配的。</span><span lang="EN-US"><br /></span><span style="font-family: 宋体">　　</span><span lang="EN-US">MFC</span><span style="font-family: 宋体">定义了数组模板类</span><span lang="EN-US">CArray</span><span style="font-family: 宋体">，并针对各种常用变量类型定义了</span><span lang="EN-US">CByteArray</span><span style="font-family: 宋体">，</span><span lang="EN-US">CArray</span><span style="font-family: 宋体">，</span><span lang="EN-US">CUIntArray</span><span style="font-family: 宋体">，</span><span lang="EN-US">CDArray</span><span style="font-family: 宋体">，</span><span lang="EN-US">CStringArray</span><span style="font-family: 宋体">，</span><span lang="EN-US">CObArray</span><span style="font-family: 宋体">，</span><span lang="EN-US">CPtrArray</span><span style="font-family: 宋体">。</span></p>
<p>&nbsp;</p>
<table style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; padding-bottom: 1px; margin: 1px; padding-left: 1px; width: 550px; padding-right: 1px; color: #000000; border-top: #000000 1px solid; border-right: #000000 1px solid; padding-top: 1px" border="2" cellpadding="0" align="center">
<tbody>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span style="font-family: 宋体">数组类</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span style="font-family: 宋体">变量类型</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span lang="EN-US">&nbsp;</span><span style="font-family: 宋体">变量数值范围</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">&nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体">头文件</span></p></td></tr>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">CArray</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span style="font-family: 宋体">通过模板类的参数类型设定各种类型</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span style="font-family: 宋体">　</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: left" align="left"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; Afxtempl.h</span></p></td></tr>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">CByteArray</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span lang="EN-US">8</span><span style="font-family: 宋体">位无符号整数</span><span lang="EN-US"><span class="Apple-converted-space">&nbsp;</span>BYTE</span><span style="font-family: 宋体">类型</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span lang="EN-US">0&#8212;255</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: left" align="left"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Afxcoll.h</span></p></td></tr>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">CArray</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span lang="EN-US">16</span><span style="font-family: 宋体">位无符号整数</span><span lang="EN-US"><span class="Apple-converted-space">&nbsp;</span>WORD</span><span style="font-family: 宋体">类型</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span lang="EN-US">0&#8212;65535</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: left" align="left"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Afxcoll.h</span></p></td></tr>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">CDArray</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span lang="EN-US">32</span><span style="font-family: 宋体">位无符号整数</span><span lang="EN-US"><span class="Apple-converted-space">&nbsp;</span>DWORD</span><span style="font-family: 宋体">类型</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span lang="EN-US">0&#8212;4294967295</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: left" align="left"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Afxcoll.h</span></p></td></tr>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">CUIntArray</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span lang="EN-US">32</span><span style="font-family: 宋体">位无符号整数</span><span lang="EN-US"><span class="Apple-converted-space">&nbsp;</span>UINT</span><span style="font-family: 宋体">类型</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span lang="EN-US">0&#8212;4294967295</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: left" align="left"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; Afxcoll.h</span></p></td></tr>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">CStringArray</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span lang="EN-US">CString</span><span style="font-family: 宋体">字符串</span><span lang="EN-US"><span class="Apple-converted-space">&nbsp;</span>string</span><span style="font-family: 宋体">字符串</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span style="font-family: 宋体">　</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: left" align="left"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; Afxcoll.h</span></p></td></tr>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">CObArray</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span lang="EN-US">CObject</span><span style="font-family: 宋体">类及其派生类</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span style="font-family: 宋体">　</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: left" align="left"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; Afxcoll.h</span></p></td></tr>
<tr>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 101px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: center" align="center"><span lang="EN-US">CPtrArray</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 218px; padding-right: 0.75pt; padding-top: 0.75pt" width="39%">
<p style="text-align: center" align="center"><span lang="EN-US">void*<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体">类型指针</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 110px; padding-right: 0.75pt; padding-top: 0.75pt" width="20%">
<p style="text-align: center" align="center"><span style="font-family: 宋体">　</span></p></td>
<td style="padding-bottom: 0.75pt; padding-left: 0.75pt; width: 103px; padding-right: 0.75pt; padding-top: 0.75pt" width="18%">
<p style="text-align: left" align="left"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp; Afxcoll.h</span></p></td></tr></tbody></table>
<p>&nbsp;</p>
<p><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">应用例子1：<br /></span></p>
<p><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CArray &lt;CPoint,CPoint&amp;&gt; m_Array;</span></p>
<p><span style="font-size: 10.5pt">　　该语句定义一个</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CArray</span><span style="font-size: 10.5pt">数组对象，模板类</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CArray</span><span style="font-size: 10.5pt">有两个参数，第一个参数为数组元素的类型，该例中是</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CPoint</span><span style="font-size: 10.5pt">，即</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">m_Array</span><span style="font-size: 10.5pt">是</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CPoint</span><span style="font-size: 10.5pt">数</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt"><span class="Apple-converted-space">&nbsp;</span></span><span style="font-size: 10.5pt">组；第二个参数为引用类型，一般有两种选择，<span style="color: red">一种选择与第一个参数类型相同</span>，它意味着数组对象作为参数传递时，<span style="color: red">传递的是数组对象。</span>第二种选择是<span style="color: red">第一个参数类型的引用</span>，它意味着数组对象作为参数传递时，传递的是<span style="color: red">数组对象的指针</span>。因此，尤其对于较复杂的数组结构类型，<span style="color: red">推荐使用引用传递，节约内存同时加快程序运行速度，</span>正如本例使用的是</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CPoint&amp;</span><span style="font-size: 10.5pt">。、</span></p>
<p>注：</p>
<p>CArray&lt;int, &nbsp; int&gt; &nbsp; myArray; &nbsp; //对于基本类型如int,char和float一般要用参数传递</p>
<p>&nbsp;</p>
<p><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">m_Array.SetSize(10,10);</span></p>
<p><span style="font-size: 10.5pt">　　</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">SetSize</span><span style="font-size: 10.5pt">函数设定数组的大小，该函数有两个参数，第一个参数设定数组的大小；第二个参数设定数组增长时内存分配的大小，<span style="color: red">缺省值是－</span></span><span style="font-family: 'Times New Roman'; color: red; font-size: 10.5pt" lang="EN-US">1</span><span style="color: red; font-size: 10.5pt">，使用缺省值可以保证内存分配得更加合理。本例中第二个参数是</span><span style="font-family: 'Times New Roman'; color: red; font-size: 10.5pt" lang="EN-US">10</span><span style="color: red; font-size: 10.5pt">，意即增加一个数组元素会分配</span><span style="font-family: 'Times New Roman'; color: red; font-size: 10.5pt" lang="EN-US">10</span><span style="color: red; font-size: 10.5pt">个元素大小的内存供数组使用。</span><span style="font-family: 'Times New Roman'; color: red; font-size: 10.5pt" lang="EN-US"><span class="Apple-converted-space">&nbsp;</span><br /></span><span style="font-size: 10.5pt">　　您可以随时使用</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">SetSize</span><span style="font-size: 10.5pt">函数设定数组的大小，如果第一个参数值小于数组已有成员数量，<span style="color: red">多于第一个参数值的成员将被截去并释放相应内存</span>。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br /></span><span style="font-size: 10.5pt">　　在使用</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CArray</span><span style="font-size: 10.5pt">数组前，最好先使用</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">SetSize</span><span style="font-size: 10.5pt">确定其大小并申请存储空间。如果不这样做，向数组中增加元素时，需要不断地移动和拷贝元素造成运行的低效率和内存碎块。</span></p>
<p>应用例子2：</p>
<p>void CArrayDlg::OnArrayCstring()<br /><br />&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CArray&lt;CSTRING,CSTRING&amp;&gt; m_string;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString sztiger("tiger");<span class="Apple-converted-space">&nbsp;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString szbear("bear");&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CString szdog("dog");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_string.SetAtGrow(0,sztiger);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_string.SetAtGrow(2,szdog);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_string.InsertAt(1,szbear);<br /><br />}<br /><br />代码简要说明：<br /><br />m_string.SetAtGrow(2,szdog); edu-cn.com<br /><br />　　SetAtGrow有两个参数，第一个参数决定数组元素的序号值，第二个参数是元素的值。该函数根据序号值设置相应数组元素的值，功能与SetAt相近，不同之处是使用该函数设置元素值时，如果序号值大于数组的上界，数组会自动增长。<br />　　编译运行程序，细心的读者您可能会看到，第一行字符是&#8220;tiger&#8221;，第二行字符是&#8220;bear&#8221;，这是我们预料之中的，但第三行是空串，第四行是&#8220;dog&#8221;。空串是怎样造成的呢？细分析下面三行代码就可以知道：<br /><br />m_string.SetAtGrow(0,sztiger);m_string.SetAtGrow(2,szdog);m_string.InsertAt(1,szbear);<br /><br />第一行设定元素0为&#8220;tiger&#8221;，这是没有疑义的。<br />第二行设定元素2为&#8220;dog&#8221;，但是在设定元素2的同时自动将元素1填充为空串。<br /><span style="color: rgb(255,0,0)">第三行插入&#8220;bear&#8221;为元素1，同时原来的元素1和元素2后移为元素2和元素3</span>。<br /><br />怎么样，这回明白了吧。<br /><br />m_string.InsertAt(1,szbear);<br /><br />　　InsertAt函数在指定序号处插入相应元素，该函数在执行过程中，插入点后面的元素会自动后移。dc.TextOut(10,displayPos,m_string[x]);其中，m_string[x]是数组类对操作符[]的重载，数组类CArray允许使用[]操作符，类似于的常规数组。m_string[x]也可以用m_string.GetAt(x)替代。<br /><br />m_string.RemoveAt(2);<span class="Apple-converted-space">&nbsp;</span><br /><br />RemoveAt只有一个参数，即元素序号值。该函数根据元素序号值删除相应元素值，后面的元素会自动前移。<br /><br /><br />　　<span style="color: rgb(255,0,0)">最后再说明一点：RemoveAt，InsertAt函数操作时会使得数组元素移位，运行时间大于SetAt，RemoveAll，Add函数。</span></p>
<p><br /><strong><span style="font-family: 'Times New Roman'; color: #000000; font-size: 14pt" lang="EN-US">2.<span style="color: red"><span class="Apple-converted-space">&nbsp;</span></span></span><span style="font-family: 宋体; color: red; font-size: 14pt">双链表</span><span style="font-family: 'Times New Roman'; color: red; font-size: 14pt" lang="EN-US">--CList</span></strong><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br />&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体; font-size: 10.5pt">特点：<span style="color: red">插入删除很快</span>。<span style="color: red">但是通过索引访问很慢</span>，因为通过索引访问的时候，实际上是链表头开始计算个数的。所以在遍历链表的时候不要这样写：</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0; i&lt;list.GetCount(); ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POSITION pos = list.FindIndex(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Item item = list.GetAt(pos);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 10.5pt">访问方法：通过</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">POSITION</span><span style="font-family: 宋体; font-size: 10.5pt">变量访问，它实际上就是双链表节点的指针。我觉得这种访问方法比加个什么</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">iterator</span><span style="font-family: 宋体; font-size: 10.5pt">要好，因为很多时候我们都是在对链表进行插入删除操作，这个时候一个</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">iterator</span><span style="font-family: 宋体; font-size: 10.5pt">的功能有限。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br /><br /></span><strong><span style="font-family: 'Times New Roman'; color: #000000; font-size: 14pt" lang="EN-US">3.<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体; color: red; font-size: 14pt">散列</span><span style="font-family: 'Times New Roman'; color: red; font-size: 14pt" lang="EN-US">(hash)</span><span style="font-family: 宋体; color: red; font-size: 14pt">表</span><span style="font-family: 'Times New Roman'; color: red; font-size: 14pt" lang="EN-US">--CMap</span></strong><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 10.5pt">特点：通过散列算法将</span><span style="font-family: 'Times New Roman'; color: red; font-size: 10.5pt" lang="EN-US">key</span><span style="font-family: 宋体; color: red; font-size: 10.5pt">计算一个索引值</span><span style="font-family: 宋体; font-size: 10.5pt">，基本上就是<span style="color: red">一个空间换时间的应用</span>。对于重复的</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">key</span><span style="font-family: 宋体; font-size: 10.5pt">，它和大多数的</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">hash</span><span style="font-family: 宋体; font-size: 10.5pt">表结构一样，采用了一个链表。所以，如果</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">key</span><span style="font-family: 宋体; font-size: 10.5pt">重复比较多的话，他的<span style="color: red">查找还是很慢的</span>。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 10.5pt">访问方法：也是用</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">POSITION</span><span style="font-family: 宋体; font-size: 10.5pt">变量。不过需要注意的是，通过</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CMap</span><span style="font-family: 宋体; font-size: 10.5pt">提供的遍历函数得到的元素的顺序恰好和添加的顺序相反。</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br style="color: #000000" /><br /></span><strong><span style="font-family: 'Times New Roman'; color: #000000; font-size: 14pt" lang="EN-US">4.<span class="Apple-converted-space">&nbsp;</span></span><span style="font-family: 宋体; color: red; font-size: 14pt">二叉树</span><span style="font-family: 'Times New Roman'; color: red; font-size: 14pt" lang="EN-US">--</span><span style="font-family: 宋体; color: red; font-size: 14pt">无对应类</span></strong><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-family: 宋体; font-size: 10.5pt">特点：一个<span style="color: red">排序二叉树</span>的查找就是一个天生的二分法。所以，如果向二叉树中添加元素时需要进行比较的话，最好直接创建成二叉排序树，这样查找起来很快。例如，</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">CMap</span><span style="font-family: 宋体; font-size: 10.5pt">在</span><span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US">key</span><span style="font-family: 宋体; font-size: 10.5pt">重复时就可以用二叉树代替链表。</span></p></span>    <img src ="http://www.cppblog.com/xkjy3000/aggbug/179510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/xkjy3000/" target="_blank">虚空骄阳</a> 2012-06-20 16:23 <a href="http://www.cppblog.com/xkjy3000/archive/2012/06/20/179510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>