<?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[Brauche kleine Idee&#x2F;Hilfe bei array und index]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein array mit lauter int-werten die mir prioritäten angeben. Jetzt laufe ich das array durch und suche mir die grösste priorität aus und bekomme dann deren index, den ich zurückgebe. Jetzt würde ich gerne wenn das nächste mal nach der grössten priorität gesucht wird gleich an dieser position beginnen und dann bis ans ende des arrays laufen und dann wieder von beginn bis zu dem index wieder. wie kann ich das effizient gestalten?</p>
<p>Es macht doch wenig sinn sowas zu machen:</p>
<pre><code class="language-cpp">for (int i = last_idx; i &lt; array_size; i++)
{
      // do semething
}

for (int i = 0; i &lt; last_idx; i++)
{
     // do something
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/196610/brauche-kleine-idee-hilfe-bei-array-und-index</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 14:15:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/196610.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 31 Oct 2007 17:26:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Brauche kleine Idee&#x2F;Hilfe bei array und index on Wed, 31 Oct 2007 17:26:45 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe ein array mit lauter int-werten die mir prioritäten angeben. Jetzt laufe ich das array durch und suche mir die grösste priorität aus und bekomme dann deren index, den ich zurückgebe. Jetzt würde ich gerne wenn das nächste mal nach der grössten priorität gesucht wird gleich an dieser position beginnen und dann bis ans ende des arrays laufen und dann wieder von beginn bis zu dem index wieder. wie kann ich das effizient gestalten?</p>
<p>Es macht doch wenig sinn sowas zu machen:</p>
<pre><code class="language-cpp">for (int i = last_idx; i &lt; array_size; i++)
{
      // do semething
}

for (int i = 0; i &lt; last_idx; i++)
{
     // do something
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1395437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395437</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Wed, 31 Oct 2007 17:26:45 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche kleine Idee&#x2F;Hilfe bei array und index on Wed, 31 Oct 2007 18:35:00 GMT]]></title><description><![CDATA[<p>Was du vor hast, klingt gruselig.</p>
<p><strong>std::priority_queue</strong> scheint da zweckmäßiger.</p>
<p>Grüße...</p>
<p>Heiko</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1395497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395497</guid><dc:creator><![CDATA[bwbg]]></dc:creator><pubDate>Wed, 31 Oct 2007 18:35:00 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche kleine Idee&#x2F;Hilfe bei array und index on Wed, 31 Oct 2007 20:06:35 GMT]]></title><description><![CDATA[<p><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="🙂"
    /> Du hast natürlich recht Heiko....:)</p>
<p>nehmen wir mal an ich würde es gerne so ohne die stl realisieren - ginge das überhaupt schneller also so?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1395584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395584</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Wed, 31 Oct 2007 20:06:35 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche kleine Idee&#x2F;Hilfe bei array und index on Thu, 01 Nov 2007 05:44:29 GMT]]></title><description><![CDATA[<p>Was soll das werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1395710</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395710</guid><dc:creator><![CDATA[ähm]]></dc:creator><pubDate>Thu, 01 Nov 2007 05:44:29 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche kleine Idee&#x2F;Hilfe bei array und index on Thu, 01 Nov 2007 13:10:25 GMT]]></title><description><![CDATA[<p>warum wollen es immer alle ohne die STL machen? Das klingt immer in etwa wie &quot;Mein Auto steht in der Garage. Wie bau ich mir ein neues Auto, um von A nach B zu kommen?&quot; Nutzt doch einfach die Mittel die euch der Standard schon mitgibt.<br />
Wenns darum geht, sowas selbst zu entwickeln, ok, aber dann kann man immernoch mit Teilen der STL arbeiten, die man sich schon &quot;erarbeitet&quot; hat (z.B. indem man was aehnliches realisiert hat).</p>
<p>Wenn du also nicht mit std::priority_queue arbeiten willst, dann vielleicht so:</p>
<p>mach dir eine std::map&lt;prio_type, index_type&gt; (wobei beide typen ints sein koennen, bzw. index_type auch ein size_t) und lauf sie von hinten nach vorn durch. Oder gib als Comparator ein std::greater&lt;prio_type&gt; dazu, dann ist der Teil mit der groessten prio schon ganz vorn.</p>
<p>std::map ist dir noch zu viel STL? ok, dann mach dir ein C-Array von std::pair&lt;prio_type, index_type&gt; und lass einmal std::sort drueberlaufen mit std::greater&lt;std::pair&lt;prio_type, index_type&gt; &gt; als Comparator (sortiert nach dem ersten Element des pairs).</p>
<p>Immernoch zu viel STL? dann schreib dir das pair selber, einen Comparator dazu und den Sortieralgo auch noch. Dann hast du alles &quot;handmade&quot;, hoechstwahrscheinlich weniger sicher und weniger effizient als mit STL, aber das ist der Preis den man zahlen muss.</p>
<p>Du willst keine eigen Datenstruktur und kein sortieren? Nun ja, das waere zwar unvernuenftig. Warum nicht die Sprachmittel von C++ bzw. C nutzen (ja, das wuerde auch in C gehn, wenn man statt Comparator einen Funktionspointer benutzt, das pair ist sowieso der Einfachheit halber ein struct), aber es geht auch noch primitiver:</p>
<pre><code class="language-cpp">int nextprioindex(int* prioarr, int arr_size, int last_prio) {
  int prio = MINIMUM_PRIO;  //irgendwo definiert oder hardcodiert, aber bitte kein makro ;)
  int index = arr_size;
  for (int i = 0; i&lt;arr_size; ++i) {
    if (prioarr[i] &gt; prio &amp;&amp; prioarr[i] &lt; last_prio) {
      prio = prioarr[i];
      index = i;
    }
  }
  return index;
}
</code></pre>
<p>Die Funktion gibt den Index der hoechsten Prioritaet zurueck, die kleiner ist als last_prio, oder arr_size, wenn es keinen solchen Index gibt (analog zu den std::finds die hinter das letzte element im Container/array zeigen wenn nix gefunden wird)</p>
<p>Anwendung:</p>
<pre><code class="language-cpp">int main() {
  int prio_array[100];
  /* prio_array fuellen */
  int prio; 
  int index = nextprioindex(prio_array, 100, MAXIMUM_PRIO);
  while (index != 100) {
    prio = prio_array[index];
    cout &lt;&lt; &quot;Prioritaet: &lt;&lt; prio &lt;&lt; &quot;; Index: &quot; &lt;&lt; index &lt;&lt; endl;
    index = nextprioindex(prio_array, 100, prio);
  }
}
</code></pre>
<p>Ach, sorry, cout ist natuerlich als std::ostream auch Teil der STL, aber mit printf und som Kram kenn ich mich net aus <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/1395855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395855</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 01 Nov 2007 13:10:25 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche kleine Idee&#x2F;Hilfe bei array und index on Thu, 01 Nov 2007 15:21:43 GMT]]></title><description><![CDATA[<p>Mit würde spontan noch eine Lösung mit einer Linked List einfallen, was aber bei weitem nicht so elegant wie die STL-Varianten ist.</p>
<p>Einfach</p>
<pre><code>item = last_element.next();
while(item != last_element)
{
   //TODO
   item = item.next();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1395929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1395929</guid><dc:creator><![CDATA[Trill]]></dc:creator><pubDate>Thu, 01 Nov 2007 15:21:43 GMT</pubDate></item><item><title><![CDATA[Reply to Brauche kleine Idee&#x2F;Hilfe bei array und index on Thu, 01 Nov 2007 22:57:43 GMT]]></title><description><![CDATA[<p>afaiko schrieb:</p>
<blockquote>
<p>ich habe ein array mit lauter int-werten die mir prioritäten angeben. Jetzt laufe ich das array durch und suche mir die grösste priorität aus und bekomme dann deren index, den ich zurückgebe. Jetzt würde ich gerne wenn das nächste mal nach der grössten priorität gesucht wird gleich an dieser position beginnen und dann bis ans ende des arrays laufen und dann wieder von beginn bis zu dem index wieder. wie kann ich das effizient gestalten?</p>
</blockquote>
<p>Ein interessantes Problem. Ich würde mir einen eigenen Iterator dafür schreiben, der quasi im Kreis laufen kann.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;algorithm&gt;   // max_element
#include &lt;iterator&gt;    // std::iterator

template&lt; typename I &gt;
class RingIterator : public std::iterator&lt; std::forward_iterator_tag, typename std::iterator_traits&lt; I &gt;::value_type &gt;
{
public:
    RingIterator( I first, I last )
        : m_first( first ), m_last( last )
        , m_base( first )
        , m_begin( false )
    {}
    RingIterator&amp; operator++()
    {
        if( ++m_base == m_last )
            m_base = m_first;
        m_begin = false;
        return *this;
    }
    typename std::iterator_traits&lt; I &gt;::reference operator*() const
    {
        return *m_base;
    }
    bool operator==( const RingIterator&amp; b ) const
    {
        return m_base == b.m_base &amp;&amp; m_begin == b.m_begin;
    }
    RingIterator begin() const
    {
        RingIterator beg( *this );
        beg.m_begin = true;
        return beg;
    }
    I base() const { return m_base; }
private:
    I m_first, m_last;
    I m_base;
    bool m_begin;
};
template&lt; typename I &gt;
bool operator!=( const RingIterator&lt; I &gt;&amp; a, const RingIterator&lt; I &gt;&amp; b )
{
    return !(a == b);
}
</code></pre>
<p>Sieht wohl für einige Leute einschließlich des Threaderstellers kryptisch aus, aber bei der Anwendung geht's dann recht einfach</p>
<pre><code class="language-cpp">int main()
{
    using namespace std;
    int arr[] = { 1, 2, 99, -2, 99, 4, 1, 1, 1, 1, 99 };
    RingIterator&lt; int* &gt; i( arr, arr + sizeof(arr)/sizeof(*arr) ); 
    for( int n = 0; n&lt;4; ++n, ++i )
    {
        i = max_element( i.begin(), i );
        cout &lt;&lt; &quot;Maximum bei Position &quot; &lt;&lt; distance( arr, i.base() ) &lt;&lt; &quot; gefunden&quot; &lt;&lt; endl;
    }
    return 0;
}
</code></pre>
<p>Die Ausgabe ist:</p>
<pre><code>Maximum bei Position 2 gefunden
Maximum bei Position 4 gefunden
Maximum bei Position 10 gefunden
Maximum bei Position 2 gefunden
</code></pre>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1396153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1396153</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 01 Nov 2007 22:57:43 GMT</pubDate></item></channel></rss>