<?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[Auswahl aus Array mit Bedingung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Menge an Elementen, aus denen dasjenige, welches den niedrigsten Wert &gt; 0 hat und ein zweites Kriterium erfüllt, ausgewählt werden soll.<br />
Hab mal folgenden Pseudocode mit C Arrays:</p>
<pre><code class="language-cpp">// Objekte
MeineKlasse* Objekte[10];
...

// Vergleichswerte 
short Vergleichswert[10] = { 2, 5, 7, 3, 8, 1, 0, 9, 4, 6 };

// Bedingungen
bool Bedingung[10]     = { 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 };

// Auswahl
int ResultatIndex = -1;
short KleinsterWert = 10;
for(int i = 0; i &lt; 10; i++)
{
    if(Bedingung[i])
    {
        if(Vergleichswert[i] &lt; KleinsterWert &amp;&amp; Vergleichswert[i] &gt; 0)
        {
            KleinsterWert = Vergleichswert[i];
            ResultatIndex = i;
        }
    }
}
if(ResultatIndex == -1)
{
    cout &lt;&lt; &quot;Kein Wert entspricht den Kriterien.&quot; &lt;&lt; endl;
}
else
{
    cout &lt;&lt; &quot;Gesuchter Wert: &quot; &lt;&lt; *Objekte[ResultatIndex] &lt;&lt; endl;
}
</code></pre>
<p>Mit dem Index kann ich dann das gesuchte Objekt fischen.<br />
Das ganze soll dann aber mit mehr als 200 Werten funktionieren, anstatt nur mit 10, und soll eben dynamisch sein.<br />
Nun dachte ich, dass das sicher schöner geht mit STL-Mitteln, doch weis ich grad nicht wie. Einfach die C Arrays mit Vectoren ersetzen?</p>
<p>Wäre für eventuelle Tipps sehr dankbar <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/topic/158751/auswahl-aus-array-mit-bedingung</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 07:44:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/158751.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 08 Sep 2006 08:59:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 08:59:02 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Menge an Elementen, aus denen dasjenige, welches den niedrigsten Wert &gt; 0 hat und ein zweites Kriterium erfüllt, ausgewählt werden soll.<br />
Hab mal folgenden Pseudocode mit C Arrays:</p>
<pre><code class="language-cpp">// Objekte
MeineKlasse* Objekte[10];
...

// Vergleichswerte 
short Vergleichswert[10] = { 2, 5, 7, 3, 8, 1, 0, 9, 4, 6 };

// Bedingungen
bool Bedingung[10]     = { 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 };

// Auswahl
int ResultatIndex = -1;
short KleinsterWert = 10;
for(int i = 0; i &lt; 10; i++)
{
    if(Bedingung[i])
    {
        if(Vergleichswert[i] &lt; KleinsterWert &amp;&amp; Vergleichswert[i] &gt; 0)
        {
            KleinsterWert = Vergleichswert[i];
            ResultatIndex = i;
        }
    }
}
if(ResultatIndex == -1)
{
    cout &lt;&lt; &quot;Kein Wert entspricht den Kriterien.&quot; &lt;&lt; endl;
}
else
{
    cout &lt;&lt; &quot;Gesuchter Wert: &quot; &lt;&lt; *Objekte[ResultatIndex] &lt;&lt; endl;
}
</code></pre>
<p>Mit dem Index kann ich dann das gesuchte Objekt fischen.<br />
Das ganze soll dann aber mit mehr als 200 Werten funktionieren, anstatt nur mit 10, und soll eben dynamisch sein.<br />
Nun dachte ich, dass das sicher schöner geht mit STL-Mitteln, doch weis ich grad nicht wie. Einfach die C Arrays mit Vectoren ersetzen?</p>
<p>Wäre für eventuelle Tipps sehr dankbar <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/1133496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133496</guid><dc:creator><![CDATA[Jan D.]]></dc:creator><pubDate>Fri, 08 Sep 2006 08:59:02 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 09:12:29 GMT]]></title><description><![CDATA[<p>Wenn du die Arrays durch Vectoren ersetzt, geht es schonmal dynamisch. Eventuell könntest du noch die Algorithmen der STL einbauen, aber im Moment bin sich überfragt, welcher dafür geeignet ist (evt. min_element() mit einem speziell angepassten Vergleichsoperator).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133505</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 08 Sep 2006 09:12:29 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 09:13:35 GMT]]></title><description><![CDATA[<p>Also ich würde auf jeden Fall std::vector nehmen. Der ist dynamisch und bietet Zugriffsmöglichkeiten wie ein Array.</p>
<p>Zum Suchen bietet sich eigentlich std::find_if() an. In deinem Beispiel sieht es aber so aus, als benötigtest du den Index für den Vergleichswert. Da wird find_if() wohl nicht funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133507</guid><dc:creator><![CDATA[STL]]></dc:creator><pubDate>Fri, 08 Sep 2006 09:13:35 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 09:31:28 GMT]]></title><description><![CDATA[<p>Danke, das sind schonmal zwei gute Stichworte.<br />
Schau mich mal bei den Algorithmen der STL um, ob da was passt.<br />
Weitere Vorschläge sind natürlcih willkommen <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/1133517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133517</guid><dc:creator><![CDATA[Jan D.]]></dc:creator><pubDate>Fri, 08 Sep 2006 09:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 11:40:13 GMT]]></title><description><![CDATA[<p>Hallo nochmal</p>
<p>Also so ganz kapier ich das nicht.<br />
find_if liefert einfach das erste zurück, aber nicht das mit dem kleinsten Wert. min_element sieht gut aus, es gibt aber kein min_element_if oder?<br />
min_element benutzt ein Predicate oder den operator&lt;. Ich müsste wohl ein eigenes Predicate machen und da die if Abfrage einbauen. Aber, ich hab die Vergleichswerte und Bedingungen ja nicht im Objekt, also extern. Wie kann ich darauf zugreifen?</p>
<p>Kann man solche Algorithmen selber auch machen? Gibs dafür Anleitungen?</p>
<p>Sorry, steh grad bisserl aufm Schlauch..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133605</guid><dc:creator><![CDATA[Jan D.]]></dc:creator><pubDate>Fri, 08 Sep 2006 11:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 12:47:14 GMT]]></title><description><![CDATA[<p>Hier ne kleinigkeit zum spielen:</p>
<pre><code class="language-cpp">#include &quot;stdafx.h&quot;
#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;functional&gt;
#include &lt;algorithm&gt;
#include &lt;time.h&gt;

using namespace std;

// Prüft auf kleiner Wert und &gt; 0
template&lt;class Type&gt;
   struct lessgreaterzero : public binary_function &lt;Type, Type, bool&gt; 
   {
      bool operator()(
         const Type&amp; i, 
         const Type&amp; a
      ) const
	  {
		return i &lt; a &amp;&amp; i &gt; 0;
	  }
   };

int main(int argc, char* argv[])
{
	std::vector&lt;int&gt; var ;

	//-------------------------------------------------------------------------------------
	// Vector befüllen mit Zuallswerten und am Anfang eine 0 um zu prüfen ob die Funktion oben geht
	srand(static_cast&lt;int&gt;(time(NULL)));
	var.push_back(0);	// Testen ob das &gt; 0 klappt
	for(int i = 0; i &lt; 100;++i)
		var.push_back(rand());
	//-------------------------------------------------------------------------------------

	// Element suchen das passt
	int index = -1;					// Index auf -1 um zu zeigen, das nichts gefunden wurde
	vector&lt;int&gt;::iterator pos;		// Das Ergebnis von find_if speichern
	pos = find_if(var.begin(),var.end(),bind2nd(lessgreaterzero&lt;int&gt;(),4000));	// Werte prüfen auf &lt; 40000

	if(pos != var.end())				// Wenn das Ende vom Vector erreicht, wurde nichts gefunden
	 index = distance(var.begin(),pos);	// Ansonsten die Distanz von anfang bis gefundenen iterator errechnen

	//-------------------------------------------------------------------------------------
	// Alle Positionen die passen speichern und ausgeben
	vector&lt;int&gt; positionen;			

	pos = var.begin();				
	do
	{
		pos = find_if(pos,var.end(),bind2nd(lessgreaterzero&lt;int&gt;(),4000));
		if(pos == var.end())
			break;
		positionen.push_back(distance(var.begin(),pos));		

	}while(pos++ != var.end());

	// Alle index ausgeben die passen
	cout&lt;&lt;&quot;vector:\n&quot;&lt;&lt;endl;
	copy(var.begin(),var.end(),ostream_iterator&lt;int&gt;(cout,&quot;\t&quot;));
	cout&lt;&lt;&quot;\npositionen:\n&quot;&lt;&lt;endl;
	copy(positionen.begin(),positionen.end(),ostream_iterator&lt;int&gt;(cout,&quot;\t&quot;));

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1133664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133664</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Fri, 08 Sep 2006 12:47:14 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 14:04:49 GMT]]></title><description><![CDATA[<p>Danke, ja das sieht gut aus.<br />
Ich bräucht wohl etwas im Stil von:</p>
<pre><code class="language-cpp">template &lt;class ForwardIterator, class BinaryPredicate, class Predicate&gt;
ForwardIterator min_element_if (ForwardIterator first,
                                ForwardIterator last,
                                BinaryPredicate comp,
                                Predicate       pred)
{
    ForwardIterator result = last;
    for (ForwardIterator = it ; it != last; it++)
    {
        if (pred(it))
            if (comp(it, result))
                result = it;
    }
    return result;
}
</code></pre>
<p>und dann noch zwei so structs</p>
<pre><code class="language-cpp">template &lt;class T&gt;
struct less_greater_zero : public binary_function &lt;T, T, bool&gt;
{
    bool operator() (const T&amp; arg1, const T&amp; arg2) const
    {
        return i &gt; 0 &amp;&amp; arg1 &lt; arg2;
    }
};
</code></pre>
<pre><code class="language-cpp">template &lt;class T&gt;
struct has_item : public unary_function &lt;T, bool&gt;
{
    bool operator() (const T&amp; arg) const
    {
        // so und hier brauch ich Zugriff auf Bedingung[arg's Index] ausm ersten Post???
    }
};
</code></pre>
<p>Wie kann ich dem struct has_item Zugriff auf das bool-Array geben?<br />
Und wie komm ich an den Index von arg dran?</p>
<p>Wenn das so ginge wär super, macht Spass <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/1133746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133746</guid><dc:creator><![CDATA[Jan D.]]></dc:creator><pubDate>Fri, 08 Sep 2006 14:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 14:05:54 GMT]]></title><description><![CDATA[<p>uups, sorry</p>
<p>return i &gt; 0 &amp;&amp; arg1 &lt; arg2;</p>
<p>sollte</p>
<p>return arg1 &gt; 0 &amp;&amp; arg1 &lt; arg2;</p>
<p>heissen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133748</guid><dc:creator><![CDATA[Jan D.]]></dc:creator><pubDate>Fri, 08 Sep 2006 14:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 14:47:32 GMT]]></title><description><![CDATA[<p>Wenn es wirklich noch von einem zweiten Array abhängt, könnte das hier zum spielen verleiten:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;vector&gt;
#include &lt;functional&gt;
#include &lt;algorithm&gt;
#include &lt;time.h&gt;

using namespace std;

// Prüft auf kleiner Wert und &gt; 0
template&lt;class Type&gt;
   struct lessgreaterzero : public binary_function &lt;Type, Type, bool&gt; 
   {
      bool operator()(
         const Type&amp; i, 
         const Type&amp; a
      ) const
	  {
		return i &lt; a &amp;&amp; i &gt; 0;
	  }
   };

int main(int argc, char* argv[])
{
	std::vector&lt;int&gt; var ;
	std::vector&lt;bool&gt; bed;
	std::vector&lt;int&gt;  posi;

	srand(static_cast&lt;int&gt;(time(NULL)));

	for(int i = 0;i &lt; 100;++i)
	{
		int rnd = rand();
		var.push_back(rnd);
		bed.push_back(rnd &lt; rand());

	}

	for(vector&lt;bool&gt;::iterator pos = bed.begin();pos != bed.end();++pos)
	{
		// Man könnte sich noch das ständige erzeugen der struktur ersparen
		if(*pos &amp;&amp; lessgreaterzero&lt;int&gt;()(var[distance(bed.begin(),pos)],4000))
			posi.push_back(distance(bed.begin(),pos));
	}

	// Alle index ausgeben die passen
	cout&lt;&lt;&quot;bed:\n&quot;&lt;&lt;endl;
	copy(bed.begin(),bed.end(),ostream_iterator&lt;int&gt;(cout,&quot;\t&quot;));
	cout&lt;&lt;&quot;vector:\n&quot;&lt;&lt;endl;
	copy(var.begin(),var.end(),ostream_iterator&lt;int&gt;(cout,&quot;\t&quot;));
	cout&lt;&lt;&quot;\npositionen:\n&quot;&lt;&lt;endl;
	copy(posi.begin(),posi.end(),ostream_iterator&lt;int&gt;(cout,&quot;\t&quot;));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1133765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133765</guid><dc:creator><![CDATA[Knuddlbaer]]></dc:creator><pubDate>Fri, 08 Sep 2006 14:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Fri, 08 Sep 2006 15:16:02 GMT]]></title><description><![CDATA[<p>Danke, Knuddelbaer, das du meinen Spieltrieb förderst <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>
<p>distance() wieder was gelernt :life:</p>
<p>Grübel...<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /><br />
Ich übergeb einfach nen Iterator auf den Bediungunsvector:</p>
<pre><code class="language-cpp">template &lt;class ForwardIterator, class BinaryPredicate, class PredicateIterator&gt;
ForwardIterator min_element_if (ForwardIterator first,
                                ForwardIterator last,
                                BinaryPredicate comp,
                                PredicateIterator pred)
{
    ForwardIterator result = last;
    for (ForwardIterator it = first; it != last; it++, pred++ )
    {
        if (*pred)
            if (comp(*it, *result))
                result = it;
    }
    return result;
}
//Aufruf
position = min_element_if( Vergleichswert.begin(), Vergleichswert.end(), less_greater_zero, Bedingung.begin()
</code></pre>
<p>Heureka?</p>
<p>ps: ich kompiliere grad im kopf :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133783</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133783</guid><dc:creator><![CDATA[Jan D.]]></dc:creator><pubDate>Fri, 08 Sep 2006 15:16:02 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Sat, 09 Sep 2006 08:39:03 GMT]]></title><description><![CDATA[<p>Da du eine direkte Zuordnung zwischen den beiden Werten (Zahl und Gültigkeit) hast, würde ich sie nicht in getrennten Arrays rumschleppen, sondern gemeinsam - also statt zweier Vectoren 'var' und 'bed' nur einen &quot;vector&lt;pair&lt;int,bool&gt; &gt; var;&quot; (da hast du auch die Gültigkeitsbedingung im Vergleich drin:</p>
<pre><code class="language-cpp">template&lt;class Type&gt;
struct lessbed : public binary_function &lt;pair&lt;Type,bool&gt;, pair&lt;Type,bool&gt;, bool&gt; 
{
  bool operator()( const pair&lt;Type,bool&gt;&amp; i, const pair&lt;Type,bool&gt;&amp; a) const
  {
    return i.first &lt; a.first &amp;&amp; i.first*i.second &gt; 0;
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1134104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1134104</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 09 Sep 2006 08:39:03 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl aus Array mit Bedingung on Tue, 12 Sep 2006 07:30:22 GMT]]></title><description><![CDATA[<p>Die beiden Arrays sind aber unabhängig und werden unterschiedlich oft zu verschiedenen Zeiten und Quellen geändert. Von daher will ich die nicht zusammenfassen.<br />
Aber trotzdem eine gute Idee, danke nochmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1135591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1135591</guid><dc:creator><![CDATA[Jan D.]]></dc:creator><pubDate>Tue, 12 Sep 2006 07:30:22 GMT</pubDate></item></channel></rss>