﻿<?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++博客-天涯原来不远-文章分类-C++ primer读书笔记</title><link>http://www.cppblog.com/pottry/category/18863.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 20 Mar 2012 07:55:32 GMT</lastBuildDate><pubDate>Tue, 20 Mar 2012 07:55:32 GMT</pubDate><ttl>60</ttl><item><title>vector容器:capacity和reserve成员</title><link>http://www.cppblog.com/pottry/articles/168260.html</link><dc:creator>天涯原来不远</dc:creator><author>天涯原来不远</author><pubDate>Sun, 18 Mar 2012 09:15:00 GMT</pubDate><guid>http://www.cppblog.com/pottry/articles/168260.html</guid><wfw:comment>http://www.cppblog.com/pottry/comments/168260.html</wfw:comment><comments>http://www.cppblog.com/pottry/articles/168260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/pottry/comments/commentRss/168260.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/pottry/services/trackbacks/168260.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 14pt; ">为了使vector容器实现快速的内存分配，其实际分配的容量要比当前所需的空间多一些。</span><br /><span style="font-size: 14pt; ">
vector容器预留了这些额外的存储区，用于存放新添加的元素。于是，不必为每个新元素重新</span><br /><span style="font-size: 14pt; ">
分配容器。所分配的额外内存容量的确切数目因库的实现不同而不同。比起每添加一个新元素就</span><br /><span style="font-size: 14pt; ">
必须重新分配一次容器，这个分配策略带来显著的效率。事实上，其性能非常好，因此在实际应</span><br /><span style="font-size: 14pt; ">
用中&nbsp;，比起list和deque容器，vector的增长效率通常会更高。</span><br /><span style="font-size: 14pt; ">
&nbsp; &nbsp; &nbsp; vector容器处理内存分配的细节是其实现的一部分。然而，该实现部分是由vector的接</span><br /><span style="font-size: 14pt; ">
口支持的。vector类提供了两个成员函数：capacity和reserve，使程序员可与vector容器</span><br /><span style="font-size: 14pt; ">
内存分配的实现部分交互工作。capacity操作获取在容器需要分配更多的存储空间之前能够存</span><br /><span style="font-size: 14pt; ">
储的元素总数，而reserve操作则告诉vector容器应该预留多少个元素的存储空间。</span><br /><span style="font-size: 14pt; ">
&nbsp; &nbsp; &nbsp; 弄清楚容器的capacity和size的区别非常重要。size指容器当前拥有的元素个数，而capacity</span><br /><span style="font-size: 14pt; ">
则指容器在必须分配新存储空间之前可以存储的元素总数。为了说明size和capacity的交互作用，</span><br /><span style="font-size: 14pt; ">
考虑下面的程序：</span><br />
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; border-image: initial; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->vector&lt;<span style="color: #0000ff; ">int</span>&gt;&nbsp;ivec;<br />
cout&nbsp;&lt;&lt;&nbsp;"ivec:size:"&nbsp;&lt;&lt;&nbsp;&nbsp;ivec.size()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;"capacity:"&nbsp;&nbsp;&lt;&lt;&nbsp;&nbsp;ivec.capacity()&nbsp;&lt;&lt;&nbsp;endl;<br />
<br />
<span style="color: #0000FF; ">for</span>(vector&lt;<span style="color: #0000FF; ">int</span>&gt;::size_type&nbsp;ix&nbsp;=&nbsp;0;&nbsp;ix&nbsp;!=&nbsp;24;&nbsp;++ix)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ivec.push_back(ix);<br />
<br />
cout&nbsp;&lt;&lt;&nbsp;"ivec:size:"&nbsp;&lt;&lt;&nbsp;&nbsp;ivec.size()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;"capacity:"&nbsp;&nbsp;&lt;&lt;&nbsp;&nbsp;ivec.capacity()&nbsp;&lt;&lt;&nbsp;endl;<br /><br /><span style="font-size: 14pt; ">在我们的系统上运行程序时，得到以下输出结果：</span><br /><span style="font-size: 14pt; ">ivec:size: 0 capacity: 0</span><br /><span style="font-size: 14pt; ">ivec:size: 24 capacity: 32</span><br /><br /><span style="font-size: 14pt; ">由此可见，空vector容器的size是0，而标准库显然将其capacity也设置为0.当程序员在</span><br /><span style="font-size: 14pt; ">vector中插入元素时，容器的size就是所添加的元素个数，而其capacity则必须至少等于</span><br /><span style="font-size: 14pt; ">size，但通常比size值更大。</span><br /><span style="font-size: 14pt; ">现在，可如下预留额外的存储空间：</span><br /><span style="font-size: 14pt; ">ivec.reserve(50);</span><br /><br /><span style="font-size: 14pt; ">cout &lt;&lt; "ivec:size: " &lt;&lt; ivec.size()</span><br /><span style="font-size: 14pt; ">&nbsp; &nbsp; &nbsp; &nbsp;&lt;&lt; " capacity: " &lt;&lt; ivec.capacity() &lt;&lt; endl;</span><br /><span style="font-size: 14pt; ">正如下面的输出结果所示，该操作只改变了容器的capacity，而其size不变：</span><br /><span style="font-size: 14pt; ">ivec:size: 24 capacity:50</span><br /><br /><p style="color: #333333; font-family: Arial; font-size: 14px; text-align: left; background-color: #ffffff; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 18pt; line-height: 17px; "><span style="color: black; font-size: 14pt; ">reserve</span><span style="color: black; font-size: 14pt; ">是容器预留空间，但并不真正创建元素对象，在创建对象之前，不能引用容器内的元素，因此当加入新的元素时，需要用</span><span style="color: black; font-size: 14pt; ">push_back()/insert()</span><span style="color: black; font-size: 14pt; ">函数。</span></p><p style="color: #333333; font-family: Arial; font-size: 14px; text-align: left; background-color: #ffffff; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; text-indent: 18pt; line-height: 17px; "><span style="color: black; font-size: 14pt; ">resize</span><span style="color: black; font-size: 14pt; ">是改变容器的大小，并且创建对象，因此，调用这个函数之后，就可以引用容器内的对象了，因此当加入新的元素时，用</span><span style="color: black; font-size: 14pt; ">operator[]</span><span style="color: black; font-size: 14pt; ">操作符，或者用迭代器来引用元素对象。</span></p></div><img src ="http://www.cppblog.com/pottry/aggbug/168260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/pottry/" target="_blank">天涯原来不远</a> 2012-03-18 17:15 <a href="http://www.cppblog.com/pottry/articles/168260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>