<?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[Vector nach bestimmten kritieren filtern]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Vector, der Artikelobjekte enthält.</p>
<p>Gibt es eine Möglichkeit, aus dem Vector heraus die Elemente zu selektieren, die die gleiche Artikelnummber haben?</p>
<p>Ich will meinem Vector sagen: Filtere mir mal die Elemente, die die gleiche Artikelnummer haben.</p>
<p>Ist es möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287368/vector-nach-bestimmten-kritieren-filtern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 11:19:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287368.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 May 2011 08:52:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 08:52:58 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein Vector, der Artikelobjekte enthält.</p>
<p>Gibt es eine Möglichkeit, aus dem Vector heraus die Elemente zu selektieren, die die gleiche Artikelnummber haben?</p>
<p>Ich will meinem Vector sagen: Filtere mir mal die Elemente, die die gleiche Artikelnummer haben.</p>
<p>Ist es möglich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069573</guid><dc:creator><![CDATA[goldenBoy]]></dc:creator><pubDate>Fri, 27 May 2011 08:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 09:15:56 GMT]]></title><description><![CDATA[<p>Was soll denn das Ergebnis sein? Ein neuer Vektor mit den gesuchten Elementen?<br />
So z.B.</p>
<pre><code class="language-cpp">//Die Artikel-Klasse
class articles
{

    //...
    item_id_type item_id() const;
    //...
};

//Praedikat fuer find_if nach Artikelnummer
struct article_by_item_id
{
    article_by_item_id(item_id_type id) : m_id(id){}

    bool operator()(articles const &amp; a) const
    {
        return m_id == a.item_id();
    }

    item_id_type m_id;
}

//Vektor mit Artikelobjekten
std::vector&lt;articles&gt; article_list;

//Vektor irgendwie befuellen

//Vektor mit Suchergebnissen
std::vector&lt;articles&gt; filtered_list;

std::vector&lt;articles&gt;::const_iterator i = article_list.begin();

//Suchen
while(i != article_list.end())
{
    i = std::find_if(i, article_list.end(), article_by_item_id(some_id));
    if(i != article_list.end())
    {
        filtered_list.push_back(*i);
        ++i;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2069580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069580</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 27 May 2011 09:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 09:17:36 GMT]]></title><description><![CDATA[<p>goldenBoy schrieb:</p>
<blockquote>
<p>Ich will meinem Vector sagen: Filtere mir mal die Elemente, die die gleiche Artikelnummer haben.</p>
</blockquote>
<ol>
<li>Gleiche Artikelnummer wie <em>was</em>? Willst du eine Artikelnummer vorgeben?<br />
Stell dir einen vector vor, in dem 3 Artikel die Nummer 1 haben und 2 Artikel die Nummer 2. &quot;Filtere mir die Elemente, die die gleiche Artikelnummer haben&quot; hieße, dass die 3 mit Nr1 UND die beiden mit Nr2 &quot;gefiltert&quot; werden - weil sie jeweils die gleiche Artikelnummer haben.</li>
<li>Defniere &quot;filtern&quot;. Willst du genau die mit der gleichen Artikelnummer anzeigen? oder rauswerfen? oder nur einen drin lassen?</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2069582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069582</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 27 May 2011 09:17:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 09:24:09 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Gerade habe ich mir gedacht, den letzten Teil könnten man auch mit copy_if machen und dann sehe ich, dass es das gar nicht im Standard gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Edit: MSVS hats natürlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <a href="http://msdn.microsoft.com/en-us/library/ee384415.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ee384415.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069588</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 27 May 2011 09:24:09 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 09:26:59 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Tachyon schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Gerade habe ich mir gedacht, den letzten Teil könnten man auch mit copy_if machen und dann sehe ich, dass es das gar nicht im Standard gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Edit: MSVS hats natürlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> <a href="http://msdn.microsoft.com/en-us/library/ee384415.aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ee384415.aspx</a></p>
</blockquote>
<p>Haben manche Compiler als Erweiterung und kommt im nächsten Standard. Ist aber gar nicht so einfach damit, weil man beim ersten Artiekl noch nciht weiß, ob es andere mit der gleichen Nummer gibt.</p>
<pre><code class="language-cpp">struct Artikel
{
    std::string Artikelnummer;
};
std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os, const Artikel&amp; a)
{
    return os &lt;&lt; a.Artikelnummer;
}

int main()
{
    using namespace std;
    vector&lt;Artikel&gt; artikel(5);
    artikel[0].Artikelnummer =&quot;12345&quot;;
    artikel[1].Artikelnummer =&quot;13334&quot;;
    artikel[2].Artikelnummer =&quot;12334&quot;;
    artikel[3].Artikelnummer =&quot;12345&quot;;
    artikel[4].Artikelnummer =&quot;13334&quot;;

    copy(artikel.begin(), artikel.end(), ostream_iterator&lt;Artikel&gt;(cout, &quot;\n&quot;));
    auto compare = [](const Artikel&amp; l, const Artikel&amp; r)-&gt;bool
        {return l.Artikelnummer &lt; r.Artikelnummer;};

    sort(artikel.begin(), artikel.end(), compare);

    vector&lt;Artikel&gt; filter;
    for(auto range = equal_range(artikel.begin(), artikel.end(), artikel.front(), compare);;
        range = equal_range(range.second, artikel.end(), *range.second, compare))
    {
        if (distance(range.first, range.second) &gt; 1)
            copy(range.first, range.second, back_inserter(filter));
        if (range.second == artikel.end())
            break;
    }
    cout &lt;&lt; &quot; Filter:\n&quot;;
    copy(filter.begin(), filter.end(), ostream_iterator&lt;Artikel&gt;(cout, &quot;\n&quot;));
    return 0;
} 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2069591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069591</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Fri, 27 May 2011 09:26:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 09:33:09 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>goldenBoy schrieb:</p>
<blockquote>
<p>Ich will meinem Vector sagen: Filtere mir mal die Elemente, die die gleiche Artikelnummer haben.</p>
</blockquote>
<ol>
<li>Gleiche Artikelnummer wie <em>was</em>? Willst du eine Artikelnummer vorgeben?<br />
Stell dir einen vector vor, in dem 3 Artikel die Nummer 1 haben und 2 Artikel die Nummer 2. &quot;Filtere mir die Elemente, die die gleiche Artikelnummer haben&quot; hieße, dass die 3 mit Nr1 UND die beiden mit Nr2 &quot;gefiltert&quot; werden - weil sie jeweils die gleiche Artikelnummer haben.</li>
<li>Defniere &quot;filtern&quot;. Willst du genau die mit der gleichen Artikelnummer anzeigen? oder rauswerfen? oder nur einen drin lassen?</li>
</ol>
</blockquote>
<p>genauso wie du geschildert hast. Die Ergebnisse möchte ich dann in einem anderen Vektor speichern.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a>: ungefähr so habe ich mir das vorgestellt. Muss mir aber erstmal aneignen, wie Prädikate funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069595</guid><dc:creator><![CDATA[goldenBoy]]></dc:creator><pubDate>Fri, 27 May 2011 09:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 10:04:25 GMT]]></title><description><![CDATA[<p>Wenn du am Ende von jeder Artikelnummer nur noch ein Element haben willst, hilft dir <code>unique</code> oder <code>unique_copy</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069609</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Fri, 27 May 2011 10:04:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 10:04:26 GMT]]></title><description><![CDATA[<p>KasF schrieb:</p>
<blockquote>
<p>Gerade habe ich mir gedacht, den letzten Teil könnten man auch mit copy_if machen und dann sehe ich, dass es das gar nicht im Standard gibt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Momentan gibts <code>std::remove_copy_if()</code> , das Elemente <strong>nicht</strong> kopiert, auf die eine Bedingung zutrifft. Meiner Meinung nach wäre <code>std::copy_if_not()</code> ein besserer Name dafür gewesen. Und natürlich brauchts den viel häufigeren Fall ohne Negation, nämlich <code>std::copy_if()</code> . Zum Glück kommt das jetzt auch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069610</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069610</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 27 May 2011 10:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 10:13:28 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...Meiner Meinung nach wäre <code>std::copy_if_not()</code> ein besserer Name dafür gewesen...</p>
</blockquote>
<p>Ist das nicht eher <code>std::copy_not_if</code> ? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> Ne, passt schon. Aber der Name ist echt schlecht gewählt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069617</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 27 May 2011 10:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 10:21:10 GMT]]></title><description><![CDATA[<p>Zuerst kommt normalerweise die Operation und dann ein Anhängsel. &quot;copy_not_if&quot; klingt so, als wäre es eine Variante von &quot;copy_not&quot;, und was soll so ein Algorithmus tun? <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>Eigentlich brauchts sowas ohnehin nicht, wenn man <code>copy_if</code> hat. Ich meine, <code>find_if</code> oder <code>count_if</code> haben auch keine separate Überladung für negative Prädikate. Dazu kann man Kapselfunktoren benutzen, teilweise ist ja sogar der <code>operator!</code> überladen.</p>
<p>Der STL-Algorithmus <code>remove_copy_if</code> wurde wahrscheinlich so genannt, weil es auch ein <code>remove_copy</code> gibt (kopiere ausser bei Gleichheit mit bestimmtem Wert). So gesehen sind die beiden lediglich Varianten der Inplace-Algorithmen <code>remove</code> und <code>remove_if</code> , was dann wieder Sinn ergibt. Nur ist es ein wenig inkonsistent mit <code>copy_if</code> ... Naja <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069618</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 27 May 2011 10:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vector nach bestimmten kritieren filtern on Fri, 27 May 2011 11:09:07 GMT]]></title><description><![CDATA[<p>goldenBoy schrieb:</p>
<blockquote>
<p>genauso wie du geschildert hast. Die Ergebnisse möchte ich dann in einem anderen Vektor speichern.</p>
</blockquote>
<p>Also alle Elemente, deren Artikelnummer mehrfach vorkommt, in einen anderen vector? Ich würds in 2 Schritten machen:</p>
<ol>
<li>Zähle zu jeder ArtNr die Elemente</li>
<li>Kopiere alle Elemtente, beideren ArtNr mehr als einer gezählt wurde.</li>
</ol>
<p>in C++0x</p>
<pre><code class="language-cpp">class article
{
    //...
    item_id_type item_id() const;
    //...
};

std::vector&lt;article&gt; getArticlesWithCommonId(std::vector&lt;article&gt; const&amp; articles)
{
  std::map&lt;article::item_id_type, unsigned int&gt; counts;
  for(article&amp; : articles)
    ++(counts[article.item_id()]); //schritt 1)

  std::vector&lt;article&gt; withCommonId;
  std::copy_if(articles.begin(), articles.end(),
               std::back_inserter(withCommonId), 
               [&amp;](article const&amp; a)
               {
                 return counts[a.item_id()] &gt; 1;
               });  //schritt 2)

  return withCommonId;
}
</code></pre>
<p>Ausprobiert hier:<br />
<a href="http://ideone.com/f658y" rel="nofollow">http://ideone.com/f658y</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069651</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 27 May 2011 11:09:07 GMT</pubDate></item></channel></rss>