﻿<?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++&amp;STL</title><link>http://www.cppblog.com/deadpunk/category/2137.html</link><description>我没有技术</description><language>zh-cn</language><lastBuildDate>Sun, 25 May 2008 10:45:15 GMT</lastBuildDate><pubDate>Sun, 25 May 2008 10:45:15 GMT</pubDate><ttl>60</ttl><item><title>stl容器学习总结 (转自:http://www.cppblog.com/mzty/archive/2007/03/15/19875.html)</title><link>http://www.cppblog.com/deadpunk/archive/2007/03/15/19879.html</link><dc:creator>活着就是折腾，所以当然要骠悍的折腾</dc:creator><author>活着就是折腾，所以当然要骠悍的折腾</author><pubDate>Thu, 15 Mar 2007 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/deadpunk/archive/2007/03/15/19879.html</guid><wfw:comment>http://www.cppblog.com/deadpunk/comments/19879.html</wfw:comment><comments>http://www.cppblog.com/deadpunk/archive/2007/03/15/19879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deadpunk/comments/commentRss/19879.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deadpunk/services/trackbacks/19879.html</trackback:ping><description><![CDATA[
		<p>stl容器学习总结<br /><br /><font style="BACKGROUND-COLOR: #ff0099">一 迭代器（iterator）</font></p>
		<p>迭代器：<br />迭代器是类似指针的对象，STL算法利用它们对存储在容器中的对象序列进行遍历。<br />5种类别：1、输入迭代器    <br />         2、输出迭代器    <br />         3、前向迭代器    <br />         4、双向迭代器    <br />         5、随机访问迭代器  </p>
		<p>常用的迭代器：<br /> istream_iterator&lt; &gt;输入流迭代器<br /> istreambuf_iterator&lt;&gt;输入流块迭代器<br /> ostream_iterator&lt; &gt;输出流迭代器<br /> ostreambuf_iterator&lt;&gt; 输出流块迭代器<br /> back_insert_iterator&lt;Container&gt; 使用Container的push_back成员函数<br /> front_insert_iterator&lt;Container&gt; 使用Container的push_front成员函数<br /> insert_iterator&lt;Container&gt; 使用Container的insert成员函数<br /> reverse_iterator&lt;Container&gt; 从后向前使用Container的insert成员函数<br /> const——iterator&lt;&gt;</p>
		<p> </p>
		<p>
				<font style="BACKGROUND-COLOR: #ff0099">二 分配算符（Allocators）</font>
		</p>
		<p>看看stl中默认的allocator：</p>
		<p> namespace std {<br />      template &lt;class T&gt;<br />      class allocator {<br />        public:<br />          //type definitions<br />          typedef size_t    size_type;   //represent the size of the largest object in the allocation model<br />          typedef ptrdiff_t difference_type; //The type for signed integral values that can represent the distance between any two pointers in the            </p>
		<p>                                  //allocation model<br />          typedef T*        pointer; <br />          typedef const T*  const_pointer;<br />          typedef T&amp;        reference;<br />          typedef const T&amp;  const_reference;<br />          typedef T         value_type;  //The type of the elements</p>
		<p>
				<br />          //rebind allocator to type U<br />          template &lt;class U&gt;<br />          struct rebind {<br />              typedef allocator&lt;U&gt; other;<br />          };</p>
		<p>
				<br />          //return address of values<br />          pointer       address(reference value) const;<br />          const_pointer address(const_reference value) const;</p>
		<p>
				<br />          //constructors and destructor<br />          allocator() throw();<br />          allocator(const allocator&amp;) throw();<br />          template &lt;class U&gt;<br />            allocator(const allocator&lt;U&gt;&amp;) throw();<br />          ~allocator() throw();</p>
		<p>
				<br />          //return maximum number of elements that can be allocated<br />          size_type max_size() const throw();</p>
		<p>
				<br />          // allocate but don't initialize num elements of type T<br />          pointer allocate(size_type num,<br />                           allocator&lt;void&gt;::const_pointer hint = 0);</p>
		<p>
				<br />          // initialize elements of allocated storage p with value value<br />          void construct(pointer p, const T&amp; value);</p>
		<p>
				<br />          // delete elements of initialized storage p<br />          void destroy(pointer p);</p>
		<p>
				<br />          // deallocate storage p of deleted elements<br />          void deallocate(pointer p, size_type num);<br />      };<br />   }</p>
		<p>看了上面的allocator，我们已经基本知道他的用处，他一般用在容器中，作为容器的一个成员，但一般是用模版参数传入，这样才可以让我们换成我们自定义的allocator。</p>
		<p>
				<br />
				<font style="BACKGROUND-COLOR: #ff0099">三 容器简介</font>
		</p>
		<p>STL标准容器类简介<br />标准容器类  说明<br />顺序性容器<br />vector   相当与数组，从后面快速的插入与删除，直接访问任何元素<br />deque   双队列，从前面或后面快速的插入与删除，直接访问任何元素<br />list   双链表，从任何地方快速插入与删除<br />关联容器<br />set   快速查找，不允许重复值<br />multiset  快速查找，允许重复值<br />map   一对一映射，基于关键字快速查找，不允许重复值<br />multimap  一对多映射，基于关键字快速查找，允许重复值<br />容器适配器<br />stack   后进先出<br />queue   先进先出<br />priority_queue  最高优先级元素总是第一个出列</p>
		<p>所有标准库共有函数<br />默认构造函数  提供容器默认初始化的构造函数。<br />复制构造函数  将容器初始化为现有同类容器副本的构造函数<br />析构函数  不再需要容器时进行内存整理的析构函数<br />empty   容器中没有元素时返回true,否则返回false<br />max_size  返回容器中最大元素个数<br />size   返回容器中当前元素个数<br />operator=  将一个容器赋给另一个容器<br />operator&lt;  如果第一个容器小于第二个容器，返回true，否则返回false，<br />operator&lt;=  如果第一个容器小于或等于第二个容器，返回true，否则返回false<br />operator&gt;  如果第一个容器大于第二个容器，返回true，否则返回false<br />operator&gt;=  如果第一个容器大于或等于第二个容器，返回true，否则返回false<br />operator==  如果第一个容器等于第二个容器，返回true，否则返回false<br />operator!=  如果第一个容器不等于第二个容器，返回true，否则返回false<br />swap   交换两个容器的元素</p>
		<p>其中operator&gt;,operator&gt;=,operator&lt;,operator&lt;=,operator==,operator!=均不适用于priority_queue</p>
		<p>顺序容器和关联容器共有函数<br />begin  该函数两个版本返回iterator或const_iterator，引用容器第一个元素<br />end  该函数两个版本返回iterator或const_iterator,引用容器最后一个元素后面一位<br />rbegin  该函数两个版本返回reverse_iterator或const_reverse_iterator,引用容器最后一个元素<br />rend  该函数两个版本返回reverse_iterator或const_reverse_iterator，引用容器第一个元素前面一位<br />erase  从容器中清除一个或几个元素<br />clear  清除容器中所有元素</p>
		<p>下表显示了顺序容器和关联容器中常用的typedef，这些typedef常用于变量、参数和函数返回值的一般性声明。<br />value_type  容器中存放元素的类型<br />reference  容器中存放元素类型的引用<br />const_reference 容器中存放元素类型的常量引用，这种引用只能读取容器中的元素和进行const操作<br />pointer  容器中存放元素类型的指针<br />iterator  指向容器中存放元素类型的迭代器<br />const_iterator  指向容器中存放元素类型的常量迭代器，只能读取容器中的元素<br />reverse_iterator  指向容器中存放元素类型的逆向迭代器，这种迭代器在容器中逆向迭代<br />const_reverse_iterator  指向容器中存放元素类型的逆向迭代器，只能读取容器中的元素<br />difference_type  引用相同容器的两个迭代器相减结果的类型（list和关联容器没有定义operator-）<br />size_type  用于计算容器中项目数和检索顺序容器的类型（不能对list检索）</p>
		<p>
				<font style="BACKGROUND-COLOR: #ff0099">四 容器的比较</font>
		</p>
		<p>vector  （连续的空间存储,可以使用【】操作符）快速的访问随机的元素，快速的在末尾插入元素，但是在序列中间岁间的插入，删除元素要慢，而且如果一开始分配的空间不够</p>
		<p>的话，有一个重新分  配更大空间，然后拷贝的性能开销<br />deque （小片的连续，小片间用链表相连，实际上就是一个每小片指针的数组，因为知道类型，所以还是可以使用【】，只是速度没有vector快）快速的访问随机的元素，快速</p>
		<p>的在开始和末尾插入元素，随机的插入，删除元素要慢，空间的重新分配要比vector快<br />list   （每个元素间用链表相连）访问随机元素不如vector快，随机的插入元素比vector快，对每个元素分配空间，所以不存在空间不够，重新分配的情况</p>
		<p>
				<br />set 内部元素唯一，用一棵平衡树结构来存储，因此遍历的时候就排序了，查找也比较快的哦。<br />map 一对一的映射的结合，key不能重复。<br />multiset<br />multimap</p>
		<p>stack 适配器，必须结合其他的容器使用<br />queue 是受限制的dequem<br />vector&lt;bool&gt; 与bitset&lt;&gt; ,前面的可以动态改变长度。<br />priority_queue 插入的元素就有优先级顺序，top出来的就是优先级最高的了<br />valarray 专门进行数值计算的，增加特殊的数学函数。<br /><br /><font style="BACKGROUND-COLOR: #ff0099">接下来，stl的输入输出流</font></p>
<img src ="http://www.cppblog.com/deadpunk/aggbug/19879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deadpunk/" target="_blank">活着就是折腾，所以当然要骠悍的折腾</a> 2007-03-15 12:01 <a href="http://www.cppblog.com/deadpunk/archive/2007/03/15/19879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL算法学习 (转自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.html)</title><link>http://www.cppblog.com/deadpunk/archive/2007/03/15/19878.html</link><dc:creator>活着就是折腾，所以当然要骠悍的折腾</dc:creator><author>活着就是折腾，所以当然要骠悍的折腾</author><pubDate>Thu, 15 Mar 2007 04:00:00 GMT</pubDate><guid>http://www.cppblog.com/deadpunk/archive/2007/03/15/19878.html</guid><wfw:comment>http://www.cppblog.com/deadpunk/comments/19878.html</wfw:comment><comments>http://www.cppblog.com/deadpunk/archive/2007/03/15/19878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deadpunk/comments/commentRss/19878.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deadpunk/services/trackbacks/19878.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<p>STL算法学习，小结如下：</p>
				<p>
						<font style="BACKGROUND-COLOR: #ff0099">前提:</font>
				</p>
				<p>下载stl源码：  <a href="http://www.sgi.com/tech/stl/download.html">http://www.sgi.com/tech/stl/download.html</a><br />打开网页：     <a href="http://www.sgi.com/tech/stl/stl_index.html">http://www.sgi.com/tech/stl/stl_index.html</a></p>
				<p>
						<font style="BACKGROUND-COLOR: #ff0099">一   函数对象： 因为很多的算法中多使用了函数对象</font>
				</p>
				<p>
						<br />二元函数对象，V1和V2为输入，V3为结果</p>
				<p>plus&lt;T&gt;:<br />  transform(V1.begin(), V1.end(), V2.begin(), V3.begin(),plus&lt;double&gt;());</p>
				<p>其他的二元函数对象：minus,multiples,divieds,modulus.</p>
				<p>二元断言函数对象，使用时需要bind2nd（）或bind1st（）来绑定比较对象。</p>
				<p>less&lt;T&gt;:<br />  find_if(L.begin(), L.end(), bind2nd(less&lt;int&gt;(), 0));</p>
				<p>其他的二元断言函数：equal_to,notequal_to,greater,greater_equal,less_equal,logical_and,logical_or</p>
				<p>二元逻辑函数</p>
				<p>binary_negate:<br />const char* wptr = find_if(str, str + MAXLEN,<br />                           compose2(not2(logical_or&lt;bool&gt;()),<br />                                    bind2nd(equal_to&lt;char&gt;(), ' '),<br />                                    bind2nd(equal_to&lt;char&gt;(), '\n')));</p>
				<p>一元函数对象</p>
				<p>negate：<br />transform(V1.begin(), V1.end(), V2.begin(),<br />          negate&lt;int&gt;());</p>
				<p>一元断定函数对象</p>
				<p>logical_not:<br />  transform(V.begin(), V.end(), V.begin(), logical_not&lt;bool&gt;());</p>
				<p>一元逻辑函数</p>
				<p>unary_negate:</p>
				<p>
						<br />
						<font style="BACKGROUND-COLOR: #ff0099">二   函数对象发生器：主要用来填充序列。<br /><br /><br /></font>产生不重复的随机数：<br />// Generate unique random numbers from 0 to mod:<br />class URandGen {<br />  std::set&lt;int&gt; used;<br />  int limit;<br />public:<br />  URandGen(int lim) : limit(lim) {<br />    srand(time(0));<br />  }<br />  int operator()() {<br />    while(true) {<br />      int i = int(rand()) % limit;<br />      if(used.find(i) == used.end()) {<br />        used.insert(i);<br />        return i;<br />      }<br />    }<br />  }<br />};</p>
				<p>const int sz = 10;<br />const int max = 50;<br />vector&lt;int&gt; x(sz), y(sz), r(sz);<br />//An integer random number generator:<br />URandGen urg(max);<br />generate_n(x.begin(), sz, urg);</p>
				<p>
						<font style="BACKGROUND-COLOR: #ff0099">三 函数对象适配器 ： 将函数转化为函数对象</font>
				</p>
				<p>ptr_fun:一般函数适配器</p>
				<p>一元实例：<br />transform(first, last, first,<br />          compose1(negate&lt;double&gt;, ptr_fun(fabs)));</p>
				<p>二元实例：<br />list&lt;char*&gt;::iterator item = <br />              find_if(L.begin(), L.end(),<br />                      not1(binder2nd(ptr_fun(strcmp), "OK")));</p>
				<p>not1：对一元的断定函数对象取反的适配器。</p>
				<p>not2: 对二元的断定函数对象取反的适配器。</p>
				<p>mem_fun与mem_fun_ref：类成员函数的适配器,区别是一个需要指针，而另一个仅需要一般对象。如下：<br />shape是一个指针变量，则foreach(v.begin(),v.end(),mem_fun(&amp;shape::draw));<br />但如果shape是一般的变量，不是指针，则foreach（v.begin(),v.end(),mem_fun_ref(&amp;shape::draw)）；</p>
				<p>
						<font style="BACKGROUND-COLOR: #ff0099">四   算法：</font>
				</p>
				<p>拷贝：<br />copy（）<br />reverse_copy()<br />rotate_copy()<br />remove_copy()  拷贝不等于某值的元素到另一个序列。<br />remove_copy_if() 拷贝符合条件的到另一个序列。</p>
				<p>填充和生成：<br />fill()<br />fill_n() 填充序列中的n个元素。<br />generate（）为序列中的每个元素调用gen（）函数。</p>
				<p>排列：<br />next_permuttion() 后一个排列。<br />prev_permutation()</p>
				<p>partition() 划分，将满足条件的元素移动到序列的前面。<br />stable_partition()</p>
				<p>查找和替换：<br />find（）<br />binary_search() 在一个已经有顺序的序列上查找。<br />find_if()<br />search() 检查第二个序列是否在第一个序列中出现，且顺序相同。</p>
				<p>删除：注意必须调用erase（）来真正删除<br />remove（）<br />unique（）删除相邻重复元素，最好现排序。</p>
				<p>合并序列：<br />merge（）</p>
				<p>数值算法：<br />accumulate（） 对序列的每个元素进行运算后求和。<br />transform（） 也可以对每个元素进行运算。<br />计数：<br />size（）总个数。<br />count（）等于某值的元素个数。</p>
				<p>adjacent_difference 序列中的后一个减前与他相邻的前一个得到新的序列。</p>
				<p>adiacent_find </p>
				<p>
						<font style="BACKGROUND-COLOR: #ff0099">五   所有的算法：</font>
				</p>
				<p>
						<span lang="EN-US">
								<span>
										<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">     </span>
								</span>
						</span>
						<font size="2">
								<b>
										<span lang="EN-US">
												<font face="Tahoma">accumlate</font>
										</span>
								</b>
								<span style="FONT-FAMILY: 宋体">：</span>
								<span lang="EN-US">
										<font face="Tahoma">iterator</font>
								</span>
								<span style="FONT-FAMILY: 宋体">对标志的序列中的元素之和，加到一个由</span>
								<span lang="EN-US">
										<font face="Tahoma">init</font>
								</span>
								<span style="FONT-FAMILY: 宋体">指定的初始值上。重载的版本不再做加法，而是传进来的二元操作符被应用到元素上。</span>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">adjacent_different</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：创建一个新序列，该序列的每个新值都代表了当前元素与上一个元素的差。重载版本用指定的二元操作计算相邻元素的差。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">adjacent_find</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：在</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">对标志的元素范围内，查找一对相邻的重复元素，如果找到返回一个</span>
										<span lang="EN-US">ForwardIterator</span>
										<span style="FONT-FAMILY: 宋体">，指向这对元素的第一个元素。否则返回</span>
										<span lang="EN-US">last</span>
										<span style="FONT-FAMILY: 宋体">。重载版本使用输入的二元操作符代替相等的判断。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">binary_search</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：在有序序列中查找</span>
										<span lang="EN-US">value</span>
										<span style="FONT-FAMILY: 宋体">，如果找到返回</span>
										<span lang="EN-US">true</span>
										<span style="FONT-FAMILY: 宋体">。重载的版本使用指定的比较函数对象或者函数指针来判断相等。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">copy</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：复制序列。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">copy_backward</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：除了元素以相反的顺序被拷贝外，别的和</span>
										<span lang="EN-US">copy</span>
										<span style="FONT-FAMILY: 宋体">相同。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">count</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：利用等于操作符，把标志范围类的元素与输入的值进行比较，并返回相等元素的个数。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">count_if</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：对于标志范围类的元素，应用输入的操作符，并返回结果为</span>
										<span lang="EN-US">true</span>
										<span style="FONT-FAMILY: 宋体">的次数。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">equal</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：如果两个序列在范围内的元素都相等，则</span>
										<span lang="EN-US">equal</span>
										<span style="FONT-FAMILY: 宋体">返回</span>
										<span lang="EN-US">true</span>
										<span style="FONT-FAMILY: 宋体">。重载版本使用输入的操作符代替了默认的等于操作符。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">equal_range</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：返回一对</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">，第一个</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">表示由</span>
										<span lang="EN-US">lower_bound</span>
										<span style="FONT-FAMILY: 宋体">返回的</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">，第二个表示由</span>
										<span lang="EN-US">upper_bound</span>
										<span style="FONT-FAMILY: 宋体">返回的</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">值。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">fill</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：将输入的值的拷贝赋给范围内的每个元素。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">fill_n</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：将输入的值赋值给</span>
										<span lang="EN-US">first</span>
										<span style="FONT-FAMILY: 宋体">到</span>
										<span lang="EN-US">frist+n</span>
										<span style="FONT-FAMILY: 宋体">范围内的元素。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">find</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：利用底层元素的等于操作符，对范围内的元素与输入的值进行比较。当匹配时，结束搜索，返回该元素的一个</span>
										<span lang="EN-US">InputIterator</span>
										<span style="FONT-FAMILY: 宋体">。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">find_if</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：使用输入的函数替代了等于操作符执行了</span>
										<span lang="EN-US">find</span>
										<span style="FONT-FAMILY: 宋体">。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">find_end</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：在范围内查找“由输入的另外一个</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">对标志的第二个序列”的最后一次出现。重载版本中使用了用户输入的操作符替代等于操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">find_first_of</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：在范围内查找“由输入的另外一个</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">对标志的第二个序列”中的任意一个元素的第一次出现。重载版本中使用了用户自定义的操作符。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">for_each</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：依次对范围内的所有元素执行输入的函数。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">generate</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：通过对输入的函数</span>
										<span lang="EN-US">gen</span>
										<span style="FONT-FAMILY: 宋体">的连续调用来填充指定的范围。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">generate_n</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：填充</span>
										<span lang="EN-US">n</span>
										<span style="FONT-FAMILY: 宋体">个元素。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">includes</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：判断</span>
										<span lang="EN-US">[first1, last1)</span>
										<span style="FONT-FAMILY: 宋体">的一个元素是否被包含在另外一个序列中。使用底层元素的</span>
										<span lang="EN-US">&lt;=</span>
										<span style="FONT-FAMILY: 宋体">操作符，重载版本使用用户输入的函数。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">inner_product</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：对两个序列做内积</span>
										<span lang="EN-US">(</span>
										<span style="FONT-FAMILY: 宋体">对应的元素相乘，再求和</span>
										<span lang="EN-US">)</span>
										<span style="FONT-FAMILY: 宋体">，并将内积加到一个输入的的初始值上。重载版本使用了用户定义的操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">inner_merge</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：合并两个排过序的连续序列，结果序列覆盖了两端范围，重载版本使用输入的操作进行排序。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">iter_swap</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：交换两个</span>
										<span lang="EN-US">ForwardIterator</span>
										<span style="FONT-FAMILY: 宋体">的值。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">lexicographical_compare</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：比较两个序列。重载版本使用了用户自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">lower_bound</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：返回一个</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">，它指向在范围内的有序序列中可以插入指定值而不破坏容器顺序的第一个位置。重载函数使用了自定义的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">max</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：返回两个元素中的较大的一个，重载版本使用了自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">max_element</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：返回一个</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">，指出序列中最大的元素。重载版本使用自定义的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">min</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：两个元素中的较小者。重载版本使用自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">min_element</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：类似与</span>
										<span lang="EN-US">max_element</span>
										<span style="FONT-FAMILY: 宋体">，不过返回最小的元素。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">merge</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：合并两个有序序列，并存放到另外一个序列中。重载版本使用自定义的比较。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">mismatch</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：并行的比较两个序列，指出第一个不匹配的位置，它返回一对</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">，标志第一个不匹配的元素位置。如果都匹配，返回每个容器的</span>
										<span lang="EN-US">last</span>
										<span style="FONT-FAMILY: 宋体">。重载版本使用自定义的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">next_permutation</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：取出当前范围内的排列，并将其重新排序为下一个排列。重载版本使用自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">nth_element</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：将范围内的序列重新排序，使所有小于第</span>
										<span lang="EN-US">n</span>
										<span style="FONT-FAMILY: 宋体">个元素的元素都出现在它前面，而大于它的都出现在后面，重载版本使用了自定义的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">partial_sort</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：对整个序列做部分排序，被排序元素的个数正好可以被放到范围内。重载版本使用自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">partial_sort_copy</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：与</span>
										<span lang="EN-US">partial_sort</span>
										<span style="FONT-FAMILY: 宋体">相同，除了将经过排序的序列复制到另外一个容器。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">partial_sum</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：创建一个新的元素序列，其中每个元素的值代表了范围内该位置之前所有元素之和。重载版本使用了自定义操作替代加法。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">partition</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：对范围内元素重新排序，使用输入的函数，把计算结果为</span>
										<span lang="EN-US">true</span>
										<span style="FONT-FAMILY: 宋体">的元素都放在结果为</span>
										<span lang="EN-US">false</span>
										<span style="FONT-FAMILY: 宋体">的元素之前。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">prev_permutation</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：取出范围内的序列并将它重新排序为上一个序列。如果不存在上一个序列则返回</span>
										<span lang="EN-US">false</span>
										<span style="FONT-FAMILY: 宋体">。重载版本使用自定义的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">random_shuffle</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：对范围内的元素随机调整次序。重载版本输入一个随机数产生操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">remove</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：删除在范围内的所有等于指定的元素，注意，该函数并不真正删除元素。内置数组不适合使用</span>
										<span lang="EN-US">remove</span>
										<span style="FONT-FAMILY: 宋体">和</span>
										<span lang="EN-US">remove_if</span>
										<span style="FONT-FAMILY: 宋体">函数。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">remove_copy</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：将所有不匹配的元素都复制到一个指定容器，返回的</span>
										<span lang="EN-US">OutputIterator</span>
										<span style="FONT-FAMILY: 宋体">指向被拷贝的末元素的下一个位置。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">remove_if</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：删除所有范围内输入操作结果为</span>
										<span lang="EN-US">true</span>
										<span style="FONT-FAMILY: 宋体">的元素。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">remove_copy_if</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：将所有不匹配的元素拷贝到一个指定容器。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">replace</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：将范围内的所有等于</span>
										<span lang="EN-US">old_value</span>
										<span style="FONT-FAMILY: 宋体">的元素都用</span>
										<span lang="EN-US">new_value</span>
										<span style="FONT-FAMILY: 宋体">替代。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">replace_copy</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：与</span>
										<span lang="EN-US">replace</span>
										<span style="FONT-FAMILY: 宋体">类似，不过将结果写入另外一个容器。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">replace_if</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：将范围内的所有操作结果为</span>
										<span lang="EN-US">true</span>
										<span style="FONT-FAMILY: 宋体">的元素用新值替代。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">replace_copy_if</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：类似与</span>
										<span lang="EN-US">replace_if</span>
										<span style="FONT-FAMILY: 宋体">，不过将结果写入另外一个容器。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">reverse</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：将范围内元素重新按反序排列。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">reverse_copy</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：类似与</span>
										<span lang="EN-US">reverse</span>
										<span style="FONT-FAMILY: 宋体">，不过将结果写入另外一个容器。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">rotate</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：将范围内的元素移到容器末尾，由</span>
										<span lang="EN-US">middle</span>
										<span style="FONT-FAMILY: 宋体">指向的元素成为容器第一个元素。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">rotate_copy</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：类似与</span>
										<span lang="EN-US">rotate</span>
										<span style="FONT-FAMILY: 宋体">，不过将结果写入另外一个容器。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">search</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：给出了两个范围，返回一个</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">，指向在范围内第一次出现子序列的位置。重载版本使用自定义的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">search_n</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：在范围内查找</span>
										<span lang="EN-US">value</span>
										<span style="FONT-FAMILY: 宋体">出现</span>
										<span lang="EN-US">n</span>
										<span style="FONT-FAMILY: 宋体">次的子序列。重载版本使用自定义的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">set_difference</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：构造一个排过序的序列，其中的元素出现在第一个序列中，但是不包含在第二个序列中。重载版本使用自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">set_intersection</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：构造一个排过序的序列，其中的元素在两个序列中都存在。重载版本使用自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">set_symmetric_difference</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：构造一个排过序的序列，其中的元素在第一个序列中出现，但是不出现在第二个序列中。重载版本使用自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">set_union</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：构造一个排过序的序列，它包含两个序列中的所有的不重复元素。重载版本使用自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">sort</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：以升序重新排列范围内的元素，重载版本使用了自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">stable_partition</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：与</span>
										<span lang="EN-US">partition</span>
										<span style="FONT-FAMILY: 宋体">类似，不过它不保证保留容器中的相对顺序。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">stable_sort</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：类似与</span>
										<span lang="EN-US">sort</span>
										<span style="FONT-FAMILY: 宋体">，不过保留相等元素之间的顺序关系。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">swap</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：交换存储在两个对象中的值。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">swap_range</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：将在范围内的元素与另外一个序列的元素值进行交换。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">transform</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：将输入的操作作用在范围内的每个元素上，并产生一个新的序列。重载版本将操作作用在一对元素上，另外一个元素来自输入的另外一个序列。结果输出到指定的容器。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">unique</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：清除序列中重复的元素，和</span>
										<span lang="EN-US">remove</span>
										<span style="FONT-FAMILY: 宋体">类似，它也不能真正的删除元素。重载版本使用了自定义的操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">unique_copy</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：类似与</span>
										<span lang="EN-US">unique</span>
										<span style="FONT-FAMILY: 宋体">，不过它把结果输出到另外一个容器。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">upper_bound</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：返回一个</span>
										<span lang="EN-US">iterator</span>
										<span style="FONT-FAMILY: 宋体">，它指向在范围内的有序序列中插入</span>
										<span lang="EN-US">value</span>
										<span style="FONT-FAMILY: 宋体">而不破坏容器顺序的最后一个位置，该位置标志了一个大于</span>
										<span lang="EN-US">value</span>
										<span style="FONT-FAMILY: 宋体">的值。重载版本使用了输入的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">堆算法：</span>
										<span lang="EN-US">C++</span>
										<span style="FONT-FAMILY: 宋体">标准库提供的是</span>
										<span lang="EN-US">max-heap</span>
										<span style="FONT-FAMILY: 宋体">。一共由以下</span>
										<span lang="EN-US">4</span>
										<span style="FONT-FAMILY: 宋体">个泛型堆算法。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">make_heap</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：把范围内的元素生成一个堆。重载版本使用自定义的比较操作。</font>
						</span>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">pop_heap</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：并不是真正的把最大元素从堆中弹出，而是重新排序堆。它把</span>
										<span lang="EN-US">first</span>
										<span style="FONT-FAMILY: 宋体">和</span>
										<span lang="EN-US">last-1</span>
										<span style="FONT-FAMILY: 宋体">交换，然后重新做成一个堆。可以使用容器的</span>
										<span lang="EN-US">back</span>
										<span style="FONT-FAMILY: 宋体">来访问被“弹出“的元素或者使用</span>
										<span lang="EN-US">pop_back</span>
										<span style="FONT-FAMILY: 宋体">来真正的删除。重载版本使用自定义的比较操作。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">push_heap</font>
								</b>
						</span>
						<font face="Tahoma">
								<font size="2">
										<span style="FONT-FAMILY: 宋体">：假设</span>
										<span lang="EN-US">first</span>
										<span style="FONT-FAMILY: 宋体">到</span>
										<span lang="EN-US">last-1</span>
										<span style="FONT-FAMILY: 宋体">是一个有效的堆，要被加入堆的元素在位置</span>
										<span lang="EN-US">last-1</span>
										<span style="FONT-FAMILY: 宋体">，重新生成堆。在指向该函数前，必须先把元素插入容器后。重载版本使用指定的比较。</span>
								</font>
						</font>
						<span lang="EN-US">
								<br />
								<b>
										<font face="Tahoma" size="2">sort_heap</font>
								</b>
						</span>
						<span style="FONT-FAMILY: 宋体">
								<font face="Tahoma" size="2">：对范围内的序列重新排序，它假设该序列是个有序的堆。重载版本使用自定义的比较操作。</font>
						</span>
				</p>
				<p>
						<font style="BACKGROUND-COLOR: #ff0099">接下来： STL容器学习</font>
				</p>
		</div>
<img src ="http://www.cppblog.com/deadpunk/aggbug/19878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deadpunk/" target="_blank">活着就是折腾，所以当然要骠悍的折腾</a> 2007-03-15 12:00 <a href="http://www.cppblog.com/deadpunk/archive/2007/03/15/19878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STLport 的安装</title><link>http://www.cppblog.com/deadpunk/archive/2006/08/07/10917.html</link><dc:creator>活着就是折腾，所以当然要骠悍的折腾</dc:creator><author>活着就是折腾，所以当然要骠悍的折腾</author><pubDate>Mon, 07 Aug 2006 02:19:00 GMT</pubDate><guid>http://www.cppblog.com/deadpunk/archive/2006/08/07/10917.html</guid><wfw:comment>http://www.cppblog.com/deadpunk/comments/10917.html</wfw:comment><comments>http://www.cppblog.com/deadpunk/archive/2006/08/07/10917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deadpunk/comments/commentRss/10917.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deadpunk/services/trackbacks/10917.html</trackback:ping><description><![CDATA[就是用nmake,到侯捷站，只要你能编译通过它里面的例子就可以确定你已经装上了 
<p>在 Borland C++ 及 Visual C++ 环境中使用 STLport</p><p>孟岩 <br />侯捷注：本文承作者孟岩先生应允， <br />转载於此以飨台湾读者，非常感谢。 </p><p>未得孟岩先生之同意，任何人请勿将此文再做转载。</p><p>以下红色为译注，紫色为侯捷个人认为宜再斟酌之处。 <br />浅蓝色是侯捷个人阅读时的神秘标记。 </p><p>本繁体文系直接转码，并未将大陆惯用术语转换为台湾惯用术语。</p><p><br />-------------------------------------------------------------------------------- </p><p></p><p><br />STL是一个标准，各商家根据这个标准开发了各自的STL版本。而在这形形色色的STL版本中，SGI STL无疑是最引人瞩目的一个。这当然是因为这个STL产品系出名门，其设计和编写者名单中，Alexander Stepanov和Matt Austern赫然在内，有两位大师坐镇，其代码水平自然有了最高的保证。SGI STL不但在效率上一直名列前茅，而且完全依照ISO C++之规范设计，使用者尽可放心。此外，SGI STL做到了thread-safe, 还体贴地为用户增设数种组件，如hash, hash_map,hash_multimap, slist和rope容器等等。因此无论在学习或实用中，SGI STL应是首选。 </p><p>无奈，SGI STL本质上是为了配合SGI自作的UNIX变体IRIX所量身定做，其它平台上的C++编译器想使用SGI STL，都需要一番周折。着名的GNU C++虽然也使用 SGI STL，但在发行前已经过调试整合。普通的用户，特别是Windows平台上的BCB/VC用户要想使自己的C++编译器与SGI STL共同工作，可不是一件容易的事情。好在英雄总能及时出现，俄国人Boris Fomitchev注意到这个问题之後，建立了一个free的项目，称为STLport，旨在将SGI STL的基本代码移植到各种主流编译环境中，使各种编译器的用户都能够享受到SGI STL带来的先进之处。STLport 发展过程中，曾受到Matt Austern的亲切指导，发展到今天，已经比较成熟。最新的STLport 4.0，可以从<a href="http://www.stlport.org/">www.stlport.org</a>免费下载，zip文件体积约1.2M, 可以支持向各种主流C++编译环境的移植。BCB及VC当然算是主流的编译环境，自然得到STLport的关照。但据笔者实践来看，配置过程中还有一些障碍需要跨越，本文即旨在详细指导读者在Borland C++Builder 5.5及Visual C++ 6.0 环境中配置STLport。 </p><p><br />首先请从<a href="http://www.stlport.org/">www.stlport.org</a>中下载STLport 4.0的ZIP文件，文件名stlport-4.0.zip. 然後利用WinZip等工具展开。生成stlport-4.0目录，该目录中有且仅有一个子目录，名称亦为stlport-4.0，不妨将整目录拷贝到你以为合适的位置，然後改一个合适的名字，例如配合BCB的，可以叫STL4BC，等等。 </p><p>下面分成BCB/VC两种情形来描述具体过程。</p><p><br />Borland C++Builder 5 <br />Borland C++Builder5中所带之C++编译器是5.5版本，在当前较主流的Windows平台编译器中，对於ISO C++ Standard的支持是最完善的。用它来配合SGI STL相当方便，也是笔者推荐之选。没有此开发工具的读者，可以到<a href="http://www.borland.com/">www.borland.com</a>上免费下载Borland C++ 5.5编译器的一个精装版，该精装版体积为8.54M，名称 freecommandlinetools1.exe，乃一自解压安装文件。可在Windows中执行它， <br />安装到合适的目录中。展开後体积50M。 </p><p>以下描述中，假定你使用的Windows装在C:\Windows目录。如果你有BCB5，我假设装在C:\Program Files\Borland\CBuilder5；如果你没有BCB5，而是使用上述的精简版BCC，则假设安装在C:\BCC55目录中，而STLport原包置于C:\STL4BC。</p><p>C:\STL4BC中应该有以下内容： <br />&lt;目录&gt; doc <br />&lt;目录&gt; lib <br />&lt;目录&gt; src <br />&lt;目录&gt; stlport <br />&lt;目录&gt; test <br />文件 ChangLog <br />文件 Install <br />文件 Readme <br />文件 Todo </p><p>同时确保C:\Program Files\Borland\CBuilder5\Bin或C:\BCC55\Bin在你的Path环境变量中。</p><p>笔者推荐你在安装之前读一读Install文件，其中会讲到如何避免使用SGI提供的iostream库。如果你不愿意使用SGI iostream，STLport会在原来编译器自带的iostream库外加一个 wrapper，使之能与SGI STL共同合作。不过SGI提供的iostream库标准化程度好，跟本家的 STL代码配合起来速度也快些，所以笔者实在想不出什麽理由不使用它，在这里假定大家跟笔者一样，乐于使用SGI iostream库。有不同看法者尽可以按照Install文件的说法调整。</p><p>下面一步步来：</p><p>0. 本次配置任务均在DOS命令状态下完成，请先从“开始”--&gt;“附件”菜单中选中MS-DOS方式，打开一个DOS窗口。</p><p>1. 到C:\Program Files\Borland\CBuilder5\bin中，利用你顺手的文本编辑器修改两个文件：</p><p>file1: bcc32.cfg，改成：</p><p>-I"C:\STL4BC\stlport";\ <br />"C:\Program Files\Borland\CBuilder5\Include";"C:\Program Files\Borland\CBuilder5\Include\vcl" <br />-L"C:\STL4BC\LIB";"C:\Program Files\Borland\CBuilder5\Lib";"C:\Program Files\Borland\CBuilder5\Lib\obj";"C:\Program Files\Borland\CBuilder5\Lib\release" </p><p>上面为了方便阅读用"\"符号将很长的一行折行，实际文件应该只有两行。</p><p>file2: ilink32.cfg，改成：</p><p>-L"C:\STL4BC\LIB";"C:\Program Files\Borland\CBuilder5\Lib";"C:\Program Files\Borland\CBuilder5\Lib\obj";"C:\Program Files\Borland\CBuilder5\Lib\release"</p><p>在C:\BCC55\BIN目录中，不存在这两个文件，请你自己用文字编辑器手工做出这两个文件来，内容与上面有所不同，如下</p><p>file1: bcc32.cfg，内容：</p><p>-I"C:\STL4BC\stlport";"C:\BCC55\Include"; <br />-L"C:\STL4BC\LIB";"C:\BCC55\Lib"; </p><p>file2: ilink32.cfg，内容：</p><p>-L"C:\STL4BC\LIB";"C:\BCC55\Lib";</p><p>2. 进入到C:\STL4BC\SRC目录中。</p><p>3. 执行命令copy bcb5.mak Makefile</p><p>4. 执行命令make clean all</p><p>这个命令会执行很长时间，尤其在老旧机器上，可能运行30分钟以上。屏幕不断地在显示 <br />工作情况，有时你会看到好像计算机在反复地做同样几件事，请保持耐心，这实际上是在 <br />以不同编译开关建立不同性质的目标库。 </p><p>5. 经过一段漫长的编译之後， 终於结束了。现在你再执行命令 make install 这次需要的时间不长。</p><p>6. 来到C:\STL4BC\LIB目录，执行 <br />copy *.dll c:\windows\system; </p><p>7. OK，大功告成。下面一步应该是检验一下事不是真的用上了SGI STL。rope是SGI STL提供的一个特有容器，专门用来对付超大规模字符串(string是细弦，而rope是粗绳子，可以想见rope的能力有多强)。</p><p>下面这个程序有点暴殓天物，不过也可以做一个小试验了：</p><p>//issgistl.cpp <br />#include &lt;iostream&gt; <br />#include &lt;rope&gt; </p><p>using namespace std;</p><p>int main() <br />{ <br />    // crope就是容纳char类型字符的rope容器 <br />    crope bigstr1("It took me about one hour "); <br />    crope bigstr2("to plug the STLport into Borland C++!"); <br />    crope story = bigstr1 + bigstr2; <br />    cout &lt;&lt; story &lt;&lt; endl; <br />    return 0; <br />} <br />//~issgistl.cpp </p><p>编译 bcc32 issgistl.cpp</p><p>咦，怪哉，linker报告说找不到stlport_bcc_static.lib，到C:\STL4BC\LIB看个究竟，确实并没有这个文件，倒是有一个stlport_bcb55_static.lib。笔者发现这是STLport的一个小问题，需要将库文件的名字做一点改动：</p><p>copy stlport_bcb55_static.lib stlport_bcc_static.lib</p><p>这做法比较稳妥，原来的stlport_bcb55_static.lib也保留下来。以其他选项进行编译时，还可能会遇到类似的问题，只要照葫芦画瓢该名字就没问题了。</p><p>现在再编译，应该没问题了。可能有一些warning，没有关系。只要能运行，就说明rope容器起作用了，也就是说你的SGI STL开始工作了。</p><p><br />Microsoft Visual C++ 6.0: <br />Microsoft Visual C++ 6.0是当今Windows下C++编译器主流中的主流，但是对於ISO C++的支持并不尽如人意。其所配送的STL性能也比较差。不过既然是主流，STLport自然不敢怠慢，下面介绍VC中的STLport配置方法。 </p><p>以下描述中，假定你使用的Windows装在C:\Windows目录。VC装在 C:\Program Files\Microsoft Visual Studio\VC98；而STLport原包置于C:\STL4VC。</p><p>C:\STL4VC中应该有以下内容：</p><p>&lt;目录&gt; doc <br />&lt;目录&gt; lib <br />&lt;目录&gt; src <br />&lt;目录&gt; stlport <br />&lt;目录&gt; test <br />文件 ChangLog <br />文件 Install <br />文件 Readme <br />文件 Todo </p><p>同时确保C:\Program Files\Microsoft Visual Studio\VC98\bin在你的Path环境变量中。</p><p>下面一步步来：</p><p>0. 本次配置任务均在DOS命令状态下完成，请先从“开始”--&gt;“附件”菜单中选中MS-DOS方式，打开一个DOS窗口。</p><p>1. 到C:\Program Files\Microsoft Visual Studio\VC98中，利用你顺手的文本编辑器修改两个文件vcvars32.bat，其中有两行</p><p>set INCLUDE=%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE% <br />set LIB=%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB% </p><p>改成：</p><p>set INCLUDE=C:\STL4VC\stlport;%MSVCDir%\ATL\INCLUDE;%MSVCDir%\INCLUDE;%MSVCDir%\MFC\INCLUDE;%INCLUDE% <br />set LIB=C:\STL4VC\lib;%MSVCDir%\LIB;%MSVCDir%\MFC\LIB;%LIB% </p><p>上面为了方面阅读用 "\" 符号将过长的一行折成两行，实际文件中还是一行。</p><p>修改完毕後保存，然後执行命令vcvars32。一切顺利的话应该给出一行结果：</p><p>Setting environment for using Microsoft Visual C++ tools.</p><p>如果你预设的DOS环境空间不足，这个BAT文件执行中可能导致环境空间overflow，此时应该在DOS窗口的“属性”对话框中找到“内存”页，修改“初始环境”ComboBox，改为一个较大的值，如1280或2048。然後再次开一个DOS窗口，运行vcvars32.bat。</p><p>2. 进入到C:\STL4VC\SRC目录中。</p><p>3. 执行命令copy vc6.mak Makefile</p><p>4. 执行命令make clean all</p><p>如果说BCB编译STLport的时间很长，那麽VC编译STLport的过程就更加漫长。屏幕反反复复地显示似乎是同样的内容，请务必保持耐心，这实际上是在以不同编译开关建立不同性质的目标库。</p><p>5. 经过一段漫长的编译之後， 终於结束了。现在你再执行命令</p><p>make install</p><p>这次需要的时间不那麽长，但也要有点耐心。</p><p>6. OK，大功告成。下面一步应该是检验一下事不是真的用上了SGI STL。跟上面BCB的过程差不多，找一个使用了SGI STL特性的程序，比如使用rope, slist, hash_set, hash_map等容器的程序来编译。注意，编译时务必使用下面的格式：</p><p>cl /GX /MT program.cpp</p><p>SGI STL中大量使用try..throw..catch，VC缺省情况下不支持此语法，/GX是要求VC++ Compiler打开对异常处理语法的支持。/MT则是要求VC的linker本程序obj文件与libcmt.lib连接在一起，因为SGI STL是thread-safe的，必须以multi-thread形式运行。</p><p>若要在图形界面中使用SGI STL，可在VC中调整Project--&gt;Setting(Alt+F7), 设置编译选项，注意使用/MT和/GX，并且引入选项/Ic:\stl4vc\stlport及/libpath:c:\stl4vc\lib。</p><p>整个过程在笔者的老式Pentium 150机器上运行了超过3小时，读者的机器想必快得多，但也必然会花去出乎你意料的时间。全部完成後，C:\STL4VC这个目录的体积也由原来的区区4.4M膨胀到可怕的333M，当然这其中有300M是编译过程中产生的.obj文件，如果你确信自己的STLport工作正常的话，可以删掉它们，省出硬盘空间。不过这样一来，下次若再编译，就只好再等很长时间。</p><p>另外，据笔者勘察，STLport 4.0所使用的SGI STL并非最新问世的SGI STL3.3版本，不知道把SGI STL3.3的代码导入STLport会有何效果，有兴趣的读者不妨一试。</p><p>大致情形就是这样，现在，套用STLport自带文件的结束语：</p><p>Have fun!</p><p>孟岩 <br />2001-3-11 </p><img src ="http://www.cppblog.com/deadpunk/aggbug/10917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deadpunk/" target="_blank">活着就是折腾，所以当然要骠悍的折腾</a> 2006-08-07 10:19 <a href="http://www.cppblog.com/deadpunk/archive/2006/08/07/10917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>