<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[std::set - Bleiben Iteratoren erhalten?]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>wenn ich aus einem <code>std::set</code> etwas lösche oder neue Einträge hinzufüge, bleiben die übrigen Iteratoren dann erhalten?</p>
<pre><code class="language-cpp">#include &lt;set&gt;
#include &lt;iostream&gt;

int main() {
    typedef std::set&lt;int&gt; MySet;

    MySet ms;
    ms.insert(1);
    ms.insert(5);
    ms.insert(8);
    ms.insert(3);
    ms.insert(9);

    MySet::iterator it = ms.find(8); // Iterator auf &quot;8&quot;
    ms.erase(ms.find(3));            // &quot;3&quot; löschen

    std::cout &lt;&lt; *it &lt;&lt; std::endl;   // Ist das noch möglich?
    it++;                            // Zeigt der Iterator nun auf &quot;9&quot;?
}
</code></pre>
<p>Das funktioniert auf jeden Fall mit VC, aber ist das auch so ISO-Standard?</p>
<p>Grüße,</p>
<p>daersc</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269200/std-set-bleiben-iteratoren-erhalten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 06:03:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269200.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Jun 2010 19:38:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Sun, 20 Jun 2010 19:38:24 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>wenn ich aus einem <code>std::set</code> etwas lösche oder neue Einträge hinzufüge, bleiben die übrigen Iteratoren dann erhalten?</p>
<pre><code class="language-cpp">#include &lt;set&gt;
#include &lt;iostream&gt;

int main() {
    typedef std::set&lt;int&gt; MySet;

    MySet ms;
    ms.insert(1);
    ms.insert(5);
    ms.insert(8);
    ms.insert(3);
    ms.insert(9);

    MySet::iterator it = ms.find(8); // Iterator auf &quot;8&quot;
    ms.erase(ms.find(3));            // &quot;3&quot; löschen

    std::cout &lt;&lt; *it &lt;&lt; std::endl;   // Ist das noch möglich?
    it++;                            // Zeigt der Iterator nun auf &quot;9&quot;?
}
</code></pre>
<p>Das funktioniert auf jeden Fall mit VC, aber ist das auch so ISO-Standard?</p>
<p>Grüße,</p>
<p>daersc</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1915338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1915338</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 20 Jun 2010 19:38:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Sun, 20 Jun 2010 19:41:53 GMT]]></title><description><![CDATA[<p>daersc schrieb:</p>
<blockquote>
<p>wenn ich aus einem <code>std::set</code> etwas lösche oder neue Einträge hinzufüge, bleiben die übrigen Iteratoren dann erhalten?</p>
</blockquote>
<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1915341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1915341</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 20 Jun 2010 19:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Sun, 20 Jun 2010 20:30:10 GMT]]></title><description><![CDATA[<p>Du hast doch den Code schon, wär ja auch leicht zu testen, kurz kompilieren und schon weiß mans <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Gruß freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1915364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1915364</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Sun, 20 Jun 2010 20:30:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Sun, 20 Jun 2010 20:33:55 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Du hast doch den Code schon, wär ja auch leicht zu testen, kurz kompilieren und schon weiß mans <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>daersc schrieb:</p>
<blockquote>
<p>Das funktioniert auf jeden Fall mit VC, aber ist das auch so ISO-Standard?</p>
</blockquote>
<p>Jap, hab ich ja auch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1915367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1915367</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 20 Jun 2010 20:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Sun, 20 Jun 2010 21:01:48 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Du hast doch den Code schon, wär ja auch leicht zu testen, kurz kompilieren und schon weiß mans <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Mit diesem Vorgehen wirst du früher oder später Probleme haben. Zumindest wenn du deine Projekte nicht auf einen einzigen Compiler beschränken möchtest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1915381</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1915381</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 20 Jun 2010 21:01:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Sun, 20 Jun 2010 21:10:49 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Du hast doch den Code schon, wär ja auch leicht zu testen, kurz kompilieren und schon weiß mans <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Das heißt gar nichts. Leite nicht das Verhalten Deiner C++ Implementierung als Garantie des ISO Standards ab. Das guckt man einfach nach ... entweder in einem <a href="http://www.josuttis.com/libbook/" rel="nofollow">schlauen Buch</a> oder im Standard (bzw <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1804.pdf" rel="nofollow">kostenlos zugänglicher Entwurf</a>).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1915387</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1915387</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 20 Jun 2010 21:10:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Tue, 22 Jun 2010 15:18:35 GMT]]></title><description><![CDATA[<p>Ja sorry da muss ich mich entschuldigen, hab das überlesen, dass er es mit VC getestet hat.<br />
Und dass man sich nicht nur auf seinen Kompilier verlassen soll, stimmt auch, tut mir Leid für die Antwort:D <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1915800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1915800</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Tue, 22 Jun 2010 15:18:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Tue, 22 Jun 2010 21:32:20 GMT]]></title><description><![CDATA[<p>@gelöscht: .. war die richtige Antwort im falschen Thread</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916020</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 22 Jun 2010 21:32:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Tue, 22 Jun 2010 22:04:46 GMT]]></title><description><![CDATA[<p>Was pasieren wird, weiß ich nicht: Aber einige Gedanken von mir dazu: Der Standard schreibt nicht vor, wie Iteratoren implementiert werden (und auch die Sets selbst), sondern nur bestimmte Grenzen, in denen die Operationen von der Laufzeit liegen müssen. (Wenn ich da jetzt nichts verwechsel)</p>
<p>Wenn man das Beispiel oben mit einem Vektor ausführt, und statt 8, den Iterator auf 9 sucht, dann klappt das Beispiel mit VC 2005 nicht mehr.</p>
<p>Es wäre jetzt auch denkbar, dass es eine Implementation des Iterators eines Sets ähnlich zu der eines Vektors gäbe, und damit wäre dann der Iterator nicht mehr gültig.</p>
<p>Grundsätzlich wäre ich vorsichtig mit Iteratoren, die vor der Veränderung eines Containers erstellt wurden. (Sicher nach Stroustup ist: it = find(...); tmp = it; --tmp; erase(it); ++tmp; // tmp zeigt jetzt auf das Element hinter dem gelöschten), bei allen anders bekommenen Iteratoren wäre ich vorsichtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916040</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916040</guid><dc:creator><![CDATA[thor42]]></dc:creator><pubDate>Tue, 22 Jun 2010 22:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Tue, 22 Jun 2010 22:18:55 GMT]]></title><description><![CDATA[<p>thor42 schrieb:</p>
<blockquote>
<p>Der Standard schreibt nicht vor, wie Iteratoren implementiert werden (und auch die Sets selbst), sondern nur bestimmte Grenzen, in denen die Operationen von der Laufzeit liegen müssen. (Wenn ich da jetzt nichts verwechsel)</p>
</blockquote>
<p>Nun, es gibt schon ein bisschen mehr Angaben des C++-Standards an die Iteratoren und Container als nur Zeitkomplexitäten. Zum Beispiel:</p>
<p>§23.1.2/8 (Associative Containers) schrieb:</p>
<blockquote>
<p>The insert members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.</p>
</blockquote>
<p>thor42 schrieb:</p>
<blockquote>
<p>Es wäre jetzt auch denkbar, dass es eine Implementation des Iterators eines Sets ähnlich zu der eines Vektors gäbe, und damit wäre dann der Iterator nicht mehr gültig.</p>
</blockquote>
<p>Nein, das wäre nicht denkbar. Allein schon weil es sich um verschiedene Iteratorkategorien handelt.</p>
<p>thor42 schrieb:</p>
<blockquote>
<p>Grundsätzlich wäre ich vorsichtig mit Iteratoren, die vor der Veränderung eines Containers erstellt wurden. (Sicher nach Stroustup ist: it = find(...); tmp = it; --tmp; erase(it); ++tmp; // tmp zeigt jetzt auf das Element hinter dem gelöschten), bei allen anders bekommenen Iteratoren wäre ich vorsichtig.</p>
</blockquote>
<p>Statt</p>
<pre><code class="language-cpp">it = c.find(...);
tmp = it;
--tmp;
c.erase(it);
++tmp
</code></pre>
<p>reicht bei einem assoziativen Container <code>c</code> ein</p>
<pre><code class="language-cpp">it = c.find(...);
c.erase(it++);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1916042</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916042</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Jun 2010 22:18:55 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Wed, 23 Jun 2010 08:45:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>thor42 schrieb:</p>
<blockquote>
<p>Der Standard schreibt nicht vor, wie Iteratoren implementiert werden (und auch die Sets selbst), sondern nur bestimmte Grenzen, in denen die Operationen von der Laufzeit liegen müssen. (Wenn ich da jetzt nichts verwechsel)</p>
</blockquote>
<p>Nun, es gibt schon ein bisschen mehr Angaben des C++-Standards an die Iteratoren und Container als nur Zeitkomplexitäten. Zum Beispiel:</p>
<p>§23.1.2/8 (Associative Containers) schrieb:</p>
<blockquote>
<p>The insert members shall not affect the validity of iterators and references to the container, and the erase members shall invalidate only iterators and references to the erased elements.</p>
</blockquote>
</blockquote>
<p>Ok, damit ist die Frage des Erstellers ja auch geklärt.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>thor42 schrieb:</p>
<blockquote>
<p>Es wäre jetzt auch denkbar, dass es eine Implementation des Iterators eines Sets ähnlich zu der eines Vektors gäbe, und damit wäre dann der Iterator nicht mehr gültig.</p>
</blockquote>
<p>Nein, das wäre nicht denkbar. Allein schon weil es sich um verschiedene Iteratorkategorien handelt.</p>
</blockquote>
<p>Das würde trozdem nicht ausschließen, dass es ähnlich implementiert wäre und dadurch Iteratoren ungültig würden - Aber der Standard sagt das ja anders.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>thor42 schrieb:</p>
<blockquote>
<p>Grundsätzlich wäre ich vorsichtig mit Iteratoren, die vor der Veränderung eines Containers erstellt wurden. (Sicher nach Stroustup ist: it = find(...); tmp = it; --tmp; erase(it); ++tmp; // tmp zeigt jetzt auf das Element hinter dem gelöschten), bei allen anders bekommenen Iteratoren wäre ich vorsichtig.</p>
</blockquote>
<p>Statt</p>
<pre><code class="language-cpp">it = c.find(...);
tmp = it;
--tmp;
c.erase(it);
++tmp
</code></pre>
<p>reicht bei einem assoziativen Container <code>c</code> ein</p>
<pre><code class="language-cpp">it = c.find(...);
c.erase(it++);
</code></pre>
</blockquote>
<p>[/quote]</p>
<p>Also, dass ist mit Sicherheit nicht portabel: Weil c.erase(it) macht it ungültig, und dann mit einem ungültigen Iterator weiterzuarbeiten ist laut Strousstrup undefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916133</guid><dc:creator><![CDATA[thor42]]></dc:creator><pubDate>Wed, 23 Jun 2010 08:45:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Wed, 23 Jun 2010 09:50:17 GMT]]></title><description><![CDATA[<p>thor42 schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">it = c.find(...);
c.erase(it++);
</code></pre>
</blockquote>
<p>Also, dass ist mit Sicherheit nicht portabel: Weil c.erase(it) macht it ungültig, und dann mit einem ungültigen Iterator weiterzuarbeiten ist laut Strousstrup undefiniert.</p>
</blockquote>
<p>Falsch, <code>it</code> wird nicht ungültig. Der Iterator wird erhöht, und dessen alten Wert an <code>erase()</code> übergeben. Bei der Löschung zeigt <code>it</code> bereits auf das nächste Element.</p>
<p>Die Schreibweise <code>it++</code> ist ja im Grunde das Gleiche wie du mit dem temporären Objekt gemacht hast, nur viel übersichtlicher und flexibler, da z.B. kein vorhergehendes Element existieren muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916170</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 23 Jun 2010 09:50:17 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Wed, 23 Jun 2010 15:09:10 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>thor42 schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">it = c.find(...);
c.erase(it++);
</code></pre>
</blockquote>
<p>Also, dass ist mit Sicherheit nicht portabel: Weil c.erase(it) macht it ungültig, und dann mit einem ungültigen Iterator weiterzuarbeiten ist laut Strousstrup undefiniert.</p>
</blockquote>
<p>Falsch, <code>it</code> wird nicht ungültig. Der Iterator wird erhöht, und dessen alten Wert an <code>erase()</code> übergeben. Bei der Löschung zeigt <code>it</code> bereits auf das nächste Element.</p>
<p>Die Schreibweise <code>it++</code> ist ja im Grunde das Gleiche wie du mit dem temporären Objekt gemacht hast, nur viel übersichtlicher und flexibler, da z.B. kein vorhergehendes Element existieren muss.</p>
</blockquote>
<p>Also, soweit ich den Code verstehe, ist er gleichbedeutend mit:</p>
<pre><code class="language-cpp">tmp = it;
c.erase(it);
tmp++;
it = tmp;
</code></pre>
<p>Sprich, es wird erst eine Kopie angelegt und diese Kopie wird dann hinterher erhöt, da aber tmp auf das gelöschte Element zeigt, ist dieser Iterator auch nach c.erase(...) ungültig und damit ist das ganze undefiniert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916382</guid><dc:creator><![CDATA[thor42]]></dc:creator><pubDate>Wed, 23 Jun 2010 15:09:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Wed, 23 Jun 2010 15:29:46 GMT]]></title><description><![CDATA[<p>So, grade nochmal im Strousstrup nachgeschaut:</p>
<p>unter 6.2.2 steht unter anderem folgendes:</p>
<pre><code class="language-cpp">v[i] = i++; // Undefiniertes Ergebnis
</code></pre>
<p>Daraus lässt sich schließen, dass vom Standard nicht vorgesehen ist, ob zuerst inkrementiert wird und dann die Zuweisung erfolgt, oder ob erst die Zuweisung erfolgt. Übertragen auf das Beispiel oben: Es ist im C++ standard nicht definiert, ob zuerst erase aufgerufen wird, oder ob zuerst it++ aufgerufen wird und somit ist das Ergebnis undefiniert. (Es sei denn, ich habe jetzt etwas aus dem Standard übersehen, was in dem Kapitel nicht erwähnt wird)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916383</guid><dc:creator><![CDATA[thor42]]></dc:creator><pubDate>Wed, 23 Jun 2010 15:29:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Wed, 23 Jun 2010 16:55:44 GMT]]></title><description><![CDATA[<p>Bevor eine Methode ausgeführt wird, werden zunächst alle Parameterexpressions evaluiert. Dementsprechend wird erst das Inkrement ausgeführt und danach <code>erase</code> aufgerufen.</p>
<p>Also:</p>
<pre><code class="language-cpp">auto tmp = it;
++it;
c.erase(tmp);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1916412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916412</guid><dc:creator><![CDATA[life]]></dc:creator><pubDate>Wed, 23 Jun 2010 16:55:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Wed, 23 Jun 2010 16:55:53 GMT]]></title><description><![CDATA[<p>Dein Beispiel da ist aber auch ein bisschen was andres. Im Fall von erase ist es definiert (Stichwort Sequence Point).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916413</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 23 Jun 2010 16:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::set - Bleiben Iteratoren erhalten? on Wed, 23 Jun 2010 17:14:18 GMT]]></title><description><![CDATA[<p>life schrieb:</p>
<blockquote>
<p>Bevor eine Methode ausgeführt wird, werden zunächst alle Parameterexpressions evaluiert. Dementsprechend wird erst das Inkrement ausgeführt und danach <code>erase</code> aufgerufen.</p>
<p>Also:</p>
<pre><code class="language-cpp">auto tmp = it;
++it;
c.erase(tmp);
</code></pre>
</blockquote>
<p>Ok, wenn dem so ist, dann ist es ok.</p>
<p>Und danke für das aufklären, wieder was gelernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1916421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1916421</guid><dc:creator><![CDATA[thor42]]></dc:creator><pubDate>Wed, 23 Jun 2010 17:14:18 GMT</pubDate></item></channel></rss>