﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-远风工作室-随笔分类-STL</title><link>http://www.cppblog.com/amazon/category/8955.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 28 May 2010 02:26:01 GMT</lastBuildDate><pubDate>Fri, 28 May 2010 02:26:01 GMT</pubDate><ttl>60</ttl><item><title>STL之关联容器</title><link>http://www.cppblog.com/amazon/archive/2009/10/19/98927.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 19 Oct 2009 04:00:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/10/19/98927.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/98927.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/10/19/98927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/98927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/98927.html</trackback:ping><description><![CDATA[<p>关联容器主要包括pair、map、set、mulitmap、multiset。<br>注意：<br>1.与顺序容器相比，关联容器不提供front、back、push_front()、push_back()、pop_back()、pop_front()等操作；且关联容器中的键类型作为key，必须定义"&lt;"操作符，从而可以拿来比较，对其他比较运算不作要求。<br>2.关联容器不能通过容器大小来定义，因为不知道键值是多少。<br>3.提供关系运算。<br>4.提供begin、end、rbegin、rend等操作。<br>5.提供类型别名，但是value_type不同。<br>6.提供swap和赋值操作，但不提供assign操作。<br>7.提供clear和erase操作，但只返回void类型而不是下一元素迭代器。<br>8.提供容器大小操作，但没有resize操作。<br><br><strong>1.pair类型<br></strong>#include &lt;utility&gt;<br>pair&lt;T1, T2&gt;&nbsp; p;<br>pair&lt;T1, T2&gt;&nbsp; p(v1, v2);<br>pair&lt;T1, T2&gt;&nbsp; p = make_pair(v1, v2);<br>p1 == p2<br>p1 &lt; p2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //按照字典序，先比较v1，再比较v2<br>p.first<br>p.second<br><br><strong>2.map类型</strong><br>C&lt;T1, T2&gt;&nbsp; c;<br>C&lt;T1, T2&gt;&nbsp; c1(c2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //c1和c2必须有相同的键类型和值类型<br>C&lt;T1, T2&gt;&nbsp; c(b, e);&nbsp;&nbsp;&nbsp;&nbsp; //只要求兼容<br><br>C&lt;T1, T2&gt;::size_type<br>C&lt;T1, T2&gt;::iterator<br>C&lt;T1, T2&gt;::const_iterator<br>C&lt;T1, T2&gt;::reverse_iterator<br>C&lt;T1, T2&gt;::const_reverse_iterator<br>C&lt;T1, T2&gt;::value_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//pair类型，first元素是const C&lt;T1, T2&gt;::key_type类型，second元素是C&lt;T1, T2&gt;::mapped_type类型<br>C&lt;T1, T2&gt;::key_type<br>C&lt;T1, T2&gt;::mapped_type</p>
<p>C&lt;T1, T2&gt;::iterator&nbsp; c.begin();<br>C&lt;T1, T2&gt;:::iterator&nbsp; c.end();<br>C&lt;T1, T2&gt;::iterator&nbsp; c.rbegin();<br>C&lt;T1, T2&gt;::iterator&nbsp; c.rend();<br><br>m[key]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用下标访问不存在的元素会添加新的元素(key, 初始化值)<br>m[key] = value;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用下标修改不存在的元素会添加新的元素(key, value)<br>int&nbsp; m.count(key);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //key出现的次数，0或者1<br>iterator&nbsp; m.find(key);&nbsp; //返回对应的迭代器或者超出末端迭代器，不会如[]一样添加<br><br>pair&lt;iterator, bool&gt;&nbsp; m.insert(e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //e.first不存在，则插入e.second，e.fist存在，则不变<br>void&nbsp; m.insert(b, e);<br>C&lt;T1, T2&gt;::iterator&nbsp; m.insert(iter, e);&nbsp;&nbsp;&nbsp;//iter作为起点搜索，返回指向e的迭代器<br><br>c1 = c2;<br>void&nbsp; c1.swap(c2);<br>C&lt;T1, T2&gt;::size_type&nbsp; c.size();<br>bool&nbsp; c.empty();<br><br>void&nbsp; c.clear();<br>C&lt;T1, T2&gt;::size_type&nbsp; m.erase(key);&nbsp;&nbsp;&nbsp; //返回删除的个数<br>void&nbsp; m.erase(p);<br>void&nbsp; m.erae(b, e);<br><br><br><strong>3.set类型</strong><br>set容器支持大部分的map操作，包括下面几种：<br>A.关联容器通用操作。<br>B.map的构造函数。<br>C.map的insert操作。<br>D.map的count和find操作。<br>E.map的erase操作。<br>F.不支持下标操作符。<br>G.不支持mapped_type类型，其value_type不是pair类型，而是与key_type相同的类型，且键值必须唯一。<br><br><br><strong>4.multimap和multiset类型</strong><br>multimap和multiset所支持的操作分别与map和set操作相同，只有一个例外，就是multimap不支持下标运算，因为其某个键值对应多个值；且即使是相同的操作，也做了一定的修改。<br><br>inert和erase：<br>每次调用insert必然会添加一个元素，因为键值不是唯一的。<br>带有一个键值的erase版本将删除该键的所有元素，并返回删除个数；带有一个或一对迭代器的版本只删除指定的元素，并返回void类型。<br><br>find和count：<br>map和set是顺序存储的，multimap和multiset也一样，且如果某个键对应多个实例，这些实例在容器中相邻存放。<br>count返回某键对应元素出现的次数，而find操作返回某键值的第一个实例或者end()。<br><br>lower_bound和upper_bound：<br>iterator&nbsp; lower_bound(key)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回指向键值不小于key的第一个元素的迭代器<br>iterator upper_bound(key)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回大于key的第一个元素的迭代器<br>pair&lt;iterator, iterator&gt;&nbsp; equal_range(key)&nbsp;&nbsp; //返回pair类型，first成员等价于lower_bound(key)，second成员等价于upper_bound(key)&nbsp; <br>注意：<span style="COLOR: red">lower_bound返回的迭代器不一定指向拥有特定键值的元素，如果该键值不存在，则lower_bound返回该键值应该被插入的第一个位置。这两个键不会说明键值是否存在，只是给出了某一区域。<br></span></p>
<img src ="http://www.cppblog.com/amazon/aggbug/98927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-10-19 12:00 <a href="http://www.cppblog.com/amazon/archive/2009/10/19/98927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL之顺序容器用法总结</title><link>http://www.cppblog.com/amazon/archive/2009/10/18/98897.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Sun, 18 Oct 2009 13:14:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/10/18/98897.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/98897.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/10/18/98897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/98897.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/98897.html</trackback:ping><description><![CDATA[顺序容器主要包括vector、list、deque，分别在头文件&lt;vector&gt;、&lt;list&gt;和&lt;deque&gt;中定义。<br><br><strong>1.容器创建<br></strong>C&lt;T&gt;&nbsp; c;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建空容器，适用于所有容器<br>C&lt;T&gt;&nbsp; c(c2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建c2的副本，c和c2必须是同类型容器和元素，适用所有容器<br>C&lt;T&gt;&nbsp; c(b, e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//容器类型和元素类型可兼容即可，<span style="COLOR: red">但是根据实验，貌似不行</span><br>C&lt;T&gt;&nbsp; c(n, t);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//n个t值元素，t必须是T类型或可转为T类型，适用于顺序容器<br>C&lt;T&gt;&nbsp; c(n);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //n个使用初始化值的元素，适用于顺序容器，一般是0<br><br><strong>2.迭代器操作</strong><br>*iter<br>iter-&gt;mem<br>++iter<br>iter++<br>--iter<br>iter--<br>iter1 == iter2<br>iter1 != iter2<br>--------------------------<br>iter + n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //只有vector和deque支持算术运算和关系运算，list不支持<br>iter &#8211; n<br>iter1 += iter2<br>iter1 -= iter2<br>iter1 &#8211; iter2<br>iter1 &gt; iter2<br>iter1 &lt; iter2<br>iter1 &lt;= iter2<br>iter1 &gt;= iter2<br><br><strong>3.内置类型</strong><br>C&lt;T&gt;::size_type<br>C&lt;T&gt;::iterator<br>C&lt;T&gt;::const_iterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //注意与const C&lt;T&gt;::iterator不同<br>C&lt;T&gt;::reverse_iterator<br>C&lt;T&gt;::const_reverse_iterator<br>C&lt;T&gt;::value_type<br>C&lt;T&gt;::reference&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //左值类型，即value_type&amp;<br>C&lt;T&gt;::const_reference&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //const value_type&amp;<br><br><strong>4.基本操作</strong><br>void&nbsp; c.push_back(t);<br>void&nbsp; c.push_front(t);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //只适用list、deque<br><br>void&nbsp; c.insert(p, n ,t);<br>void&nbsp; c.insert(p, b, e);<br>C&lt;T&gt;::iterator&nbsp; c.insert(p, t);<br><br>C&lt;T&gt;::size_type&nbsp; c.size();<br>C&lt;T&gt;::size_type&nbsp; c.max_size();&nbsp;&nbsp; //最多可容纳的元素，与类型有关，总存储空间固定<br>bool&nbsp; c.empyt();<br>void&nbsp; c.resize(n);<br>void&nbsp; c.resize(n, t);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //重调c的大小，新添加的元素值使用t值<br><br>c[n]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//只适用于vector、deque容器<br>C&lt;T&gt;::value_type&nbsp; c.at(n);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //只适用于vector、deque容器，<span style="COLOR: red">防止越界</span><br><br>C&lt;T&gt;::iterator&nbsp; c.erase(p);<br>C&lt;T&gt;::iterator&nbsp; e.erase(b, e);<br>void&nbsp; c.clear();<br>void&nbsp; c.pop_back();<br>void&nbsp; c.pop_front();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//只适用于list、deque容器<br><br>c1 = c2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//重设，要求c1和c2类型相同，元素类型相同<br>void&nbsp; c1.assign(b, e);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //重设，b、e不能是c1中的迭代器，类型兼容即可<br>void&nbsp; c1.assign(n, t);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //重设<br>void&nbsp; c1.swap(c2);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //c1和c2类型必须相同，且迭代器不失效<br><br><br>容器适配器包括queue、priority_queue、stack。<br>stack默认基于deque容器实现，也可以建立在vector、list和deque上；<br>queue默认基于deque容器实现，也可以建立在list和deque上；<br>priority_queue默认基于vector上，也可以建立在vector和deque上。<br>stack&lt;string, vector&lt;string&gt; &gt;&nbsp; a;<br>stack&lt;string, vector&lt;string&gt; &gt;&nbsp; a(c);<br><br><strong>1.内置类型</strong><br>C&lt;T&gt;::size_type<br>C&lt;T&gt;::value_type<br>C&lt;T&gt;::container_type<br><br><strong>2.stack的操作</strong><br>bool&nbsp; s.empty();<br>C&lt;T&gt;::size_type&nbsp; s.size();<br>void s.pop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //删除不返回<br>C&lt;T&gt;::value_type&nbsp; s.top();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回但不删除<br>void s.push(value);<br><br><strong>3.queue和priority_queue的操作<br></strong>void&nbsp; q.empty();<br>C&lt;T&gt;::size_type&nbsp; q.size();<br>void&nbsp; q.pop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //删除队首，不返回<br>C&lt;T&gt;::value_type&nbsp; q.front();&nbsp;&nbsp; //返回队首，不删除，只适用于queue<br>C&lt;T&gt;::value_type&nbsp; q.back();&nbsp;&nbsp; //返回队尾，不删除，只适用于queue<br>C&lt;T&gt;::value_type&nbsp; q.top();&nbsp;&nbsp;&nbsp; //返回最高优先级的元素，不删除，只适用于priority_type<br>void&nbsp; q.push(value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //对queue是在队尾压入，对priority_queue是适当位置插入<br><br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/98897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-10-18 21:14 <a href="http://www.cppblog.com/amazon/archive/2009/10/18/98897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL之迭代器基本概念</title><link>http://www.cppblog.com/amazon/archive/2009/10/12/94360.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Mon, 12 Oct 2009 00:31:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/10/12/94360.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/94360.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/10/12/94360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/94360.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/94360.html</trackback:ping><description><![CDATA[<p>STL是C++中重要部分之一（面向对象、STL、模板等），其中三个基本的STL组件包括：<br>1.&nbsp;迭代器。迭代器之于容器相当于指针之于数组，提供了访问容器对象的方法，事实上C++中的指针也是一种迭代器，但是要注意迭代器不仅仅是指针，不一定具有地址值。<br>2.&nbsp;容器。容器是一种模板类，例如list、vector、deque等，一般由迭代器访问容器中的数据。<br>3.&nbsp;算法。STL中数据结构和算法是分离的，各种函数在广义容器中（包括链表、数组、string对象、容器）完全通用，只要支持相应的迭代器即可。<br><br><strong>1.头文件：<br></strong>STL头文件一般不使用.h扩展，其中主要使用的头文件和对应容器类如下：<br>#include&nbsp;Container Class<br>&lt;deque&gt;&nbsp; deque<br>&lt;list&gt;&nbsp; list<br>&lt;map&gt;&nbsp; map, multimap<br>&lt;queue&gt;&nbsp; queue, priority_queue<br>&lt;set&gt;&nbsp; set, multiset<br>&lt;stack&gt;&nbsp; stack<br>&lt;vector&gt;&nbsp; vector<br>&lt;string&gt;&nbsp; string<br>&lt;iterator&gt;&nbsp; ***&lt;***&gt;::iterator<br>&lt;algorithm&gt;&nbsp; 各种算法函数<br>STL均使用标准命名空间using namespace std。<br><br><strong>2.迭代器：<br></strong>迭代器有五种类型，这五种类型是一种继承关系，具体如下：<br>Input iterators：提供对数据的只读访问，前向推进。输入迭代器可以使用==和!=来测试是否相等；使用*来访问数据；使用++操作符前向推进。例如find函数需要保证输入迭代器。<br>Output iterators：提供对数据的只写访问，前向推进。输出迭代器缺省只写，由于该迭代器无法读取对象，因此不会在任何搜索和其他算法中使用它。<br>Forward iterators：提供读写访问，前向推进。例如replace函数需要保证前向迭代器。<br>Bidirectional iterators：提供读写访问，前向或后向推进。例如reverse函数需要保证双向迭代器。<br>Random access iterators：提供读写访问，随机移动（非const的指针也是随机迭代器）。STL中的排序和搜索函数使用随机访问迭代器，随机访问迭代器可以使用关系操作符做比较。<br>除此之外，还包括一些特殊的迭代器：<br>指针迭代器：一个指针也是一种迭代器。<br>常量迭代器：对于只读变量，为了防止错误赋值，可以使用常量迭代器const_iterator，该迭代器指向的对象不允许改变。注意：const ***&lt;***&gt;::iterator的含义是该迭代器成为常量，不可指向其他数据，与常量迭代器的含义是不一样的。<br><br><strong>3.流迭代器<br></strong>将输入输出（例如标准输入输出流cin/cout或者文件流等）作为容器看待，因此接受迭代器参数的算法都可以和流一起工作。<br>STL定义模板类ostream_iterator作为输出流迭代器，其构造函数有两个参数，包括一个ostream对象和一个string值（作为间隔符），因此可以象下面一样创建一个迭代器：<br>ostream_iterator&lt;int&gt; out(cout, &#8220;\t&#8221;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义cout迭代器，可以和任何一个接受输出迭代器的函数一起使用，如copy<br>copy(....., ......, out);<br>ofstream out(&#8220;text.txt&#8221;);<br>ostream_iterator&lt;string&gt; obegin(out, &#8220;\n&#8221;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//定义文件流输出迭代器<br>----------------------------------------<br>STL定义模板类istream_iterator作为输入流迭代器，可指定读取的来源，并应该和结束迭代器比较。具体如下：<br>istream_iterator&lt;int&gt; intreader(cin);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义cin流迭代器，输出结束用ctrl+Z+回车<br>isteam_iterator&lt;int&gt; eof;&nbsp;&nbsp; //空的流迭代器表示结束<br>copy(istream_iterator&lt;string&gt;(cin), istream_iterator&lt;string&gt;(), 输出迭代器);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义无变量名的cin流迭代器<br>ifstream in(&#8220;text.txt&#8221;);<br>istream_iterator&lt;string&gt; ibegin(in);<br>istream_iterator&lt;string&gt; iend;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义文件流输入迭代器<br>还有一些具体应用如下：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">利用流迭代器填充vector</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_17_235_Open_Image onclick="this.style.display='none'; Codehighlighter1_17_235_Open_Text.style.display='none'; Codehighlighter1_17_235_Closed_Image.style.display='inline'; Codehighlighter1_17_235_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_17_235_Closed_Image onclick="this.style.display='none'; Codehighlighter1_17_235_Closed_Text.style.display='none'; Codehighlighter1_17_235_Open_Image.style.display='inline'; Codehighlighter1_17_235_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_17_235_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_17_235_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ifstream&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;ibegin(</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;iend;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span>&nbsp;vec(ibegin,&nbsp;iend);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #008000"> //貌似会有问题，类型不匹配<br></span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;copy(vec.begin(),&nbsp;vec.end(),&nbsp;ostream_iterator<span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(cout,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">利用输入流填充vector</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_253_474_Open_Image onclick="this.style.display='none'; Codehighlighter1_253_474_Open_Text.style.display='none'; Codehighlighter1_253_474_Closed_Image.style.display='inline'; Codehighlighter1_253_474_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_253_474_Closed_Image onclick="this.style.display='none'; Codehighlighter1_253_474_Closed_Text.style.display='none'; Codehighlighter1_253_474_Open_Image.style.display='inline'; Codehighlighter1_253_474_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_253_474_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_253_474_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;vec;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;copy(istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(cin),&nbsp;istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(),&nbsp;back_inserter(vec));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;sort(vec.begin(),&nbsp;vec.end());<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;copy(vec.begin(),&nbsp;vec.end(),&nbsp;ostream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(cout,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">利用流迭代器保存vector内容到文件</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_498_753_Open_Image onclick="this.style.display='none'; Codehighlighter1_498_753_Open_Text.style.display='none'; Codehighlighter1_498_753_Closed_Image.style.display='inline'; Codehighlighter1_498_753_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_498_753_Closed_Image onclick="this.style.display='none'; Codehighlighter1_498_753_Closed_Text.style.display='none'; Codehighlighter1_498_753_Open_Image.style.display='inline'; Codehighlighter1_498_753_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_498_753_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_498_753_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ifstream&nbsp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">test.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;ibegin(</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;iend;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;vec(ibegin,&nbsp;iend);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;ofstream&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">testcopy.txt</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;copy(vec.begin(),&nbsp;vec.end(),&nbsp;ostream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p><span style="COLOR: red">注意：上面用输入流迭代器来初始化vector后，不可再用这个输入流迭代器，因为随着数据的读取，迭代器已经到达输入流或者文件流的末尾了。</span><br><br><strong>4.插入迭代器：</strong><br>int arr[] = {1, 2, 3, 4, 5};<br>vector&lt;int&gt; vi;<br>copy(arr, arr + 5; vi.begin());<br>该语句不会执行，因为没有为vi分配存储空间。此时使用插入迭代器可以将值插入到容器中，自动为vi扩展存储空间，主要包括三种插入迭代器。<br>普通插入器：将对象插入到容器任何对象的前面。该迭代器使用容器的insert操作符替代赋值运算符，第一个参数是容器本身，第二个参数是容器迭代器指定插入位置。<br>Front inserters：将对象插入到数据集的前面，例如链表表头。该迭代器使用push_front操作替代赋值运算符，参数是容器本身。<span style="COLOR: red">注意如vector没有push_front的操作，所以不能使用front_inserter迭代器。</span><br>Back inserters：将对象插入到数据集的尾部，例如vector的尾部，导致vector容器扩展。该迭代器调用容器的push_back操作替代赋值运算符，参数是容器本身。<br><span style="COLOR: red">注意：使用插入迭代器可能导致容器中的其他对象移动位置，因此现有的迭代器变成非法，需要重新赋值（list除外，不受影响）。</span></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px">&nbsp;&nbsp;&nbsp; int&nbsp;arr[]&nbsp;=&nbsp;{1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5};<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">list&lt;int&gt;&nbsp;vi;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">copy(arr,&nbsp;arr&nbsp;+&nbsp;5;&nbsp;front_inserter(vi));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//最终结果按序是5&nbsp;4&nbsp;3&nbsp;2&nbsp;1，因为每次调用push_front将一个数据插入到vi的前面</span>。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">list</span>&lt;int&gt;::iterator&nbsp;p&nbsp;=&nbsp;find(vi.begin(),&nbsp;vi.end(),&nbsp;2);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">copy(arr,&nbsp;arr&nbsp;+&nbsp;2,&nbsp;inserter(vi,&nbsp;p));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #008000">//最终结果是5&nbsp;4&nbsp;3&nbsp;1&nbsp;2&nbsp;2&nbsp;1，因为调用insert一次性将所有数据插入到p前</span>。</div>
<p><br><strong>5.混合迭代器函数：</strong><br>下面两个迭代器函数非常有用：<br>advance(iterator, int)：按照指定的数目增减迭代器，iterator改变。第一个参数是迭代器，第二个参数是增减的数目（前向迭代器该数必须为正，双向或者随机迭代器该数可以为负）。<br>distance(iterator, iterator)：返回到达一个迭代器所需递增操作的数目，即两个迭代器相差的距离。<br></p>
<img src ="http://www.cppblog.com/amazon/aggbug/94360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-10-12 08:31 <a href="http://www.cppblog.com/amazon/archive/2009/10/12/94360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>容器适配器stack/queue/priority_queue小结</title><link>http://www.cppblog.com/amazon/archive/2009/08/13/93253.html</link><dc:creator>远风</dc:creator><author>远风</author><pubDate>Thu, 13 Aug 2009 12:59:00 GMT</pubDate><guid>http://www.cppblog.com/amazon/archive/2009/08/13/93253.html</guid><wfw:comment>http://www.cppblog.com/amazon/comments/93253.html</wfw:comment><comments>http://www.cppblog.com/amazon/archive/2009/08/13/93253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/amazon/comments/commentRss/93253.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/amazon/services/trackbacks/93253.html</trackback:ping><description><![CDATA[STL提供了三个容器适配器：queue、priority_queue、stack。这些适配器都是包装了vector、list、deque中某个顺序容器的包装器。注意：<span style="COLOR: red">适配器没有提供迭代器，也不能同时插入或删除多个元素。</span>下面对各个适配器进行概括总结。<br><br><strong>（1）stack用法</strong><br>#include &lt;stack&gt;<br>template &lt; typename T, typename Container=deque &gt; class stack;<br>可以使用三个标准顺序容器vecotr、deque、list中的任何一个作为stack的底层模型。<br>bool stack&lt;T&gt;::empty()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //判断堆栈是否为空<br>void stack&lt;T&gt;::pop()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //弹出栈顶数据<br>stack&lt;T&gt;::push(T x)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //压入一个数据<br>stack&lt;T&gt;::size_type stack&lt;T&gt;::size()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//返回堆栈长度<br>T stack&lt;T&gt;::top()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //得到栈顶数据<br><br><strong>（2）queue用法</strong><br>#include &lt;queue&gt;<br>template&lt;typename T, typename Container = deque&lt;T&gt; &gt; class queue;<br>第一个参数指定要在queue中存储的类型，第二个参数规定queue适配的底层容器，可供选择的容器只有dequeue和list。对大多数用途使用默认的dequeue。<br>queue&lt;T&gt;::push(T x)<br>void queue&lt;T&gt;::pop()<br>T queue&lt;T&gt;::back()<br>T queue&lt;T&gt;::front()<br>queue&lt;T&gt;::size_type queue&lt;T&gt;::size()<br>bool queue&lt;T&gt;::empty()<br><br><strong>（3）priority_queue用法<br></strong>#include &lt;queue&gt;<br>template &lt;typename T, typename Container = vector&lt;T&gt;, typename Compare = less&lt;T&gt; &gt; class priority_queue;<br>priority_queue也是一个队列，其元素按有序顺序排列。其不采用严格的FIFO顺序，给定时刻位于队头的元素正是有最高优先级的元素。如果两个元素有相同的优先级，那么它们在队列中的顺序就遵循FIFO语义。默认适配的底层容器是vector，也可以使用deque，list不能用，因为priority_queue要求能对元素随机访问以便进行排序。<br>priority_queue&lt;T&gt;::push(T x)<br>void priority_queue&lt;T&gt;::pop()<br>T priority_queue&lt;T&gt;::top()<br>priority_queue&lt;T&gt;::size_type priority_queue&lt;T&gt;::size()<br>bool priority_queue&lt;T&gt;::empty()<br><br>标准库默认使用元素类型的&lt;操作符来确定它们之间的优先级关系，用法有三：（下文转自<a href="http://www.cnblogs.com/vvilp/articles/1504436.html">http://www.cnblogs.com/vvilp/articles/1504436.html</a>）<br><br>优先队列第一种用法，通过默认使用的&lt;操作符可知在整数中元素大的优先级高。<br>priority_queue&lt;int&gt; qi;<br>示例中输出结果为：9 6 5 3 2<br><br>优先队列第二种用法，建立priority_queue时传入一个比较函数，使用<span style="COLOR: #ff0000">functional.h函数对象</span>作为比较函数。<br>priority_queue&lt;int, vector&lt;int&gt;, greater&lt;int&gt; &gt;qi2;<br>示例2中输出结果为：2 3 5 6 9<br><br>优先队列第三种用法，是自定义优先级。<br>struct node<br>{<br>&nbsp;&nbsp;&nbsp; friend bool operator&lt; (node n1, node n2)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return n1.priority &lt; n2.priority;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; int priority;<br>&nbsp;&nbsp;&nbsp; int value;<br>};<br>priority_queue&lt;node&gt; qn;<br>在示例3中输出结果为：<br>优先级&nbsp; 值<br>9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5<br>8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br>6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br>1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4<br>在该结构中，value为值，priority为优先级。通过自定义operator&lt;操作符来比较元素中的优先级。注意：必须是自定义&lt;操作符才行，把上述的结构中的&lt;操作符改成&gt;编译不通过。<br><br><br><br><br>
<img src ="http://www.cppblog.com/amazon/aggbug/93253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/amazon/" target="_blank">远风</a> 2009-08-13 20:59 <a href="http://www.cppblog.com/amazon/archive/2009/08/13/93253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>