<?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[Gleichungen als for-Schleife?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade ein kleines Problem. Ich habe eine Vektor mit 4 Integers. Und ich möchte jede mögliche Rechnung mit +,-,* und / bestimmen.</p>
<p>Also nehmen wir Zahl1 = 1; Zahl2 = 2; Zahl3 = 3; Zahl4 = 4;</p>
<p>Dann möchte ich damit z.B. 1+2+3+4; 1+2+3-4 usw. alles ausrechnen. Nun könnte ich natürlich jeder einzelne Gleichung per Hand reinschreiben, aber das müsste doch bestimmt irgendwie mit for-Schleifen gehen. Nur fällt mir grad echt nicht wirklich so ne richtige Lösung dazu ein.</p>
<p>Hat vielleicht jemand ne Idee?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/295184/gleichungen-als-for-schleife</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 13:34:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/295184.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Nov 2011 19:39:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Tue, 08 Nov 2011 19:39:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade ein kleines Problem. Ich habe eine Vektor mit 4 Integers. Und ich möchte jede mögliche Rechnung mit +,-,* und / bestimmen.</p>
<p>Also nehmen wir Zahl1 = 1; Zahl2 = 2; Zahl3 = 3; Zahl4 = 4;</p>
<p>Dann möchte ich damit z.B. 1+2+3+4; 1+2+3-4 usw. alles ausrechnen. Nun könnte ich natürlich jeder einzelne Gleichung per Hand reinschreiben, aber das müsste doch bestimmt irgendwie mit for-Schleifen gehen. Nur fällt mir grad echt nicht wirklich so ne richtige Lösung dazu ein.</p>
<p>Hat vielleicht jemand ne Idee?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142319</guid><dc:creator><![CDATA[Krol69]]></dc:creator><pubDate>Tue, 08 Nov 2011 19:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Tue, 08 Nov 2011 19:56:42 GMT]]></title><description><![CDATA[<p>Das klingt eher nach einem Fall für Templatemetaprogrammierung oder Rekursion. Habe aber gerade keine Zeit das zu zeigen, aber vielleicht springt jemand anderes auf die Stichworte an. Oder es reicht dir schon als Hinweis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142327</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142327</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 08 Nov 2011 19:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Tue, 08 Nov 2011 20:03:29 GMT]]></title><description><![CDATA[<p>sagt mir leider gar nichts, werd ich mir wohl dann mal anschauen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142330</guid><dc:creator><![CDATA[Krol69]]></dc:creator><pubDate>Tue, 08 Nov 2011 20:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Tue, 08 Nov 2011 20:22:13 GMT]]></title><description><![CDATA[<p>Hm, hab glaub so ein kleinen Ansatz.</p>
<pre><code>int calc(int number, int a, int b)
{
  int c;

  switch(numer)
  {
    case 0: c = a + b;
    case 1: c = a - b;
    case 2: c = a * b;
    case 3: c = a \ b;
  }

  \\und hier vll irgendwie rekursiv aufrufen

  return c
}
</code></pre>
<p>mal überlegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142338</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142338</guid><dc:creator><![CDATA[Krol69]]></dc:creator><pubDate>Tue, 08 Nov 2011 20:22:13 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Tue, 08 Nov 2011 21:01:31 GMT]]></title><description><![CDATA[<p>So, war doch ein bisschen trickreicher als gedacht. Für vier Zahlen wäre vermutlich hinschreiben oder was mit Makros einfacher gewesen :p . Aber dafür ist es trivial auf beliebig viele Zahlen anpassbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> und das will man doch bei solchen Abstraktionen. Manko: Punkt vor Strich wird nicht beachtet. Wenn man das auch noch will, wird es viel viel komplizierter, ehrlich gesagt fällt mir sogar nichts besseres ein, als die Gleichung am Ende zu parsen und auszurechnen. Da müsste dann wohl doch etwas mit Makros her, damit der Compiler das übernimmt. Makros sind jedoch wiederum nicht rekursiv, weshalb dann eine Erweiterung auf 5 Zahlen nicht so einfach wäre <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> . Aber genug mit solchen Gedankenspielereien, hier ist das was du (hoffentlich) wolltest:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
using namespace std;

template&lt;char what, int depth&gt; struct berechne
{
  void operator ()(int *numbers, int result, string equation)
  {
    stringstream eq;
    eq &lt;&lt; equation;
    if (what == '+')
      {
        eq &lt;&lt; &quot; + &quot; &lt;&lt; numbers[depth];
        result += numbers[depth];
      }
    if (what == '-')
      {
        eq &lt;&lt; &quot; - &quot; &lt;&lt; numbers[depth];
        result -= numbers[depth];
      }
    if (what == '*')
      {
        eq &lt;&lt; &quot; * &quot; &lt;&lt; numbers[depth];
        result *= numbers[depth];
      }
    if (what == '/')
      {
        eq &lt;&lt; &quot; / &quot; &lt;&lt; numbers[depth];
        result /= numbers[depth];
      }
    berechne&lt;'+', depth+1&gt;()(numbers, result, eq.str());
    berechne&lt;'-', depth+1&gt;()(numbers, result, eq.str());
    berechne&lt;'*', depth+1&gt;()(numbers, result, eq.str());
    berechne&lt;'/', depth+1&gt;()(numbers, result, eq.str());
  }
};

template&lt;&gt; template&lt;char what&gt; struct berechne&lt;what, 4&gt;
{
  void operator ()(int *, int result, string equation)
  {
    if (what == '+')
      cout &lt;&lt; equation &lt;&lt; &quot; = &quot; &lt;&lt; result &lt;&lt; '\n';
  }
};

int main()
{
  int numbers[]={1,2,3,4};
  stringstream eq;
  eq &lt;&lt; numbers[0];
  berechne&lt;'+', 1&gt;()(numbers, numbers[0], eq.str());
  berechne&lt;'-', 1&gt;()(numbers, numbers[0], eq.str());
  berechne&lt;'*', 1&gt;()(numbers, numbers[0], eq.str());
  berechne&lt;'/', 1&gt;()(numbers, numbers[0], eq.str());
}
</code></pre>
<p>Mit klassischer Rekursion geht es quasi genau so. Die Templateparameter werden dann eben zu normalen Parametern und die Templatespezialisierung zu einer if-Abfrage. Das geht dann natürlich zu kosten der Laufzeit. Hier vernachlässigbar, aber man kann's ja aus Prinzip so gut wie möglich machen. Das übt für die schweren Fälle, bei denen es dann drauf ankommt. Bei der TMP-Lösung sollten jedenfalls sämtliche if-Abfragen wegoptimiert werden (daher habe ich kein switch genommen, bin nicht sicher wie gut das wegoptimiert werden kann).<br />
Den Rekursionsanfang kann man sicherlich noch geschickter machen, aber ich bin gerade faul.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142355</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 08 Nov 2011 21:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Tue, 08 Nov 2011 21:09:00 GMT]]></title><description><![CDATA[<p>oh, vielen dank <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="🙂"
    /> das istt genau das was ich gesucht habe. muss ich mir aber dennoch mal genauer anschauen damit ich das nächstes mal auch selber hinbekomme <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/2142363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142363</guid><dc:creator><![CDATA[Krol69]]></dc:creator><pubDate>Tue, 08 Nov 2011 21:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Tue, 08 Nov 2011 21:19:52 GMT]]></title><description><![CDATA[<p>Krol69 schrieb:</p>
<blockquote>
<p>oh, vielen dank <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="🙂"
    /> das istt genau das was ich gesucht habe. muss ich mir aber dennoch mal genauer anschauen damit ich das nächstes mal auch selber hinbekomme <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>
</blockquote>
<p>Templatemetaprogrammierung gehört schon zum gehobenen Stoff von der Schwierigkeit her. Ich würde sogar sagen es ist das schwierigste technische Detail von C++. Es war auch vom Sprachdesign gar nicht so geplant, das wurde eher &quot;entdeckt&quot;, dass man das machen kann <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> .</p>
<p>Dies ist ein sehr einfaches Beispiel. Falls du mit Templates, teilweiser Templatespezialisierung und rekursivem Denken fit bist, kann ich versuchen, es dir zu erklären (naja, dann verstehst du es wahrscheinlich auch so, da es so einfach ist), ansonsten wirst du vermutlich nur Bahnhof verstehen. Vermutlich reicht dein Wissen über Rekursion aber zumindest, um ungefähr zu verstehen, was da abgeht, selbst wenn du den Teil der Templatemetaprogrammierung ist nicht verstehst. TMP ist so etwas wie funktionale Programmierung (d.h. praktisch, dass man alles mit Rekursion macht) zur Compilezeit, d.h. der Compiler macht die ganze Arbeit (und zwar nur einmal!), nicht das Programm (welches man dann so oft benutzen kann wie man möchte).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142366</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 08 Nov 2011 21:19:52 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Tue, 08 Nov 2011 21:28:44 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Den Rekursionsanfang kann man sicherlich noch geschickter machen, aber ich bin gerade faul.</p>
</blockquote>
<p>Naja, du hast es ja quasi schon da stehen, weil deine Aktionen nur bei bestimmten Zeichen geschehen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
using namespace std;

template&lt;int depth=0, char what='\0'&gt; struct berechne
{
  void operator ()(int *numbers, int result, string equation)
  {
    stringstream eq;
    eq &lt;&lt; equation;
    if (what == '+')
      {
        eq &lt;&lt; &quot; + &quot; &lt;&lt; numbers[depth];
        result += numbers[depth];
      }
    if (what == '-')
      {
        eq &lt;&lt; &quot; - &quot; &lt;&lt; numbers[depth];
        result -= numbers[depth];
      }
    if (what == '*')
      {
        eq &lt;&lt; &quot; * &quot; &lt;&lt; numbers[depth];
        result *= numbers[depth];
      }
    if (what == '/')
      {
        eq &lt;&lt; &quot; / &quot; &lt;&lt; numbers[depth];
        result /= numbers[depth];
      }
    berechne&lt;depth+1, '+'&gt;()(numbers, result, eq.str());
    berechne&lt;depth+1, '-'&gt;()(numbers, result, eq.str());
    berechne&lt;depth+1, '*'&gt;()(numbers, result, eq.str());
    berechne&lt;depth+1, '/'&gt;()(numbers, result, eq.str());
  } 
};

template&lt;char what&gt; struct berechne&lt;4, what&gt;
{
  void operator ()(int *, int result, string equation)
  {
    if (what == '+')
      cout &lt;&lt; equation &lt;&lt; &quot; = &quot; &lt;&lt; result &lt;&lt; '\n';
  }
};

int main()
{
  int numbers[]={1,2,3,4};
  stringstream eq;
  eq &lt;&lt; numbers[0];
  berechne&lt;&gt;()(numbers, numbers[0], eq.str());
}
</code></pre>
<p>BTW: Ich musste das <code>template&lt;&gt;</code> bei der Spezialisierung entfernen, damit VC10 es schluckt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2142371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142371</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Tue, 08 Nov 2011 21:28:44 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Wed, 09 Nov 2011 00:17:45 GMT]]></title><description><![CDATA[<p>Weil wir gerade beim Spielen sind, habe ich mal schnell die ifs elminiert; mit mpl wäre das noch einfacher</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;functional&gt;

template &lt;typename T&gt; struct identity
{
    typedef T type;
};

template &lt;template &lt;typename&gt; class func&gt; struct func_holder
{
    template &lt;typename T&gt; struct apply
        : identity&lt;func&lt;T&gt;&gt; {};
};

template &lt;char op&gt; struct op2func;
template &lt;&gt; struct op2func&lt;'+'&gt;
    : func_holder&lt;std::plus&gt; {};
template &lt;&gt; struct op2func&lt;'-'&gt;
    : func_holder&lt;std::minus&gt; {};
template &lt;&gt; struct op2func&lt;'*'&gt;
    : func_holder&lt;std::multiplies&gt; {};
template &lt;&gt; struct op2func&lt;'/'&gt;
    : func_holder&lt;std::divides&gt; {};

template&lt;char what, int depth&gt; struct berechne
{
    void operator ()(int* numbers, int result, std::string equation)
    {
      std::stringstream eq;
      eq &lt;&lt; equation;
      typedef typename op2func&lt;what&gt;::template apply&lt;int&gt;::type functor;
      eq &lt;&lt; ' ' &lt;&lt; what &lt;&lt; ' ' &lt;&lt; numbers[depth];
      result = functor()( result, numbers[depth] );
      berechne&lt;'+', depth+1&gt;()(numbers, result, eq.str());
      berechne&lt;'-', depth+1&gt;()(numbers, result, eq.str());
      berechne&lt;'*', depth+1&gt;()(numbers, result, eq.str());
      berechne&lt;'/', depth+1&gt;()(numbers, result, eq.str());
  }
};

template&lt;char what&gt; struct berechne&lt;what, 4&gt;
{
    void operator ()(int*, int result, std::string equation)
    {
        std::cout &lt;&lt; equation &lt;&lt; &quot; = &quot; &lt;&lt; result &lt;&lt; '\n';
    }
};

int main()
{
    int numbers[] = { 1, 2, 3, 4 };
    std::stringstream eq;
    eq &lt;&lt; numbers[0];
    berechne&lt;'+', 1&gt;()( numbers, numbers[0], eq.str() );
    berechne&lt;'-', 1&gt;()( numbers, numbers[0], eq.str() );
    berechne&lt;'*', 1&gt;()( numbers, numbers[0], eq.str() );
    berechne&lt;'/', 1&gt;()( numbers, numbers[0], eq.str() );
}
</code></pre>
<p>Edit: mit Beachtung des Vorrangs:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;functional&gt;
#include &lt;utility&gt;

template &lt;typename T&gt; struct identity { typedef T type; };

template &lt;template &lt;typename&gt; class func0, template &lt;typename&gt; class func1&gt; struct func_holder
{
    template &lt;typename T&gt; struct apply0 : identity&lt;func0&lt;T&gt;&gt; {};
    template &lt;typename T&gt; struct apply1 : identity&lt;func1&lt;T&gt;&gt; {};
};

template &lt;typename T&gt; struct noop_plus { T operator()(T, T rhs) const { return rhs; } };
template &lt;typename T&gt; struct noop_minus { T operator()(T, T rhs) const { return -rhs; } };

template &lt;char op&gt; struct op2func;
template &lt;&gt; struct op2func&lt;' '&gt; : func_holder&lt;noop_plus, noop_plus&gt; {};
template &lt;&gt; struct op2func&lt;'+'&gt; : func_holder&lt;std::plus, noop_plus&gt; {};
template &lt;&gt; struct op2func&lt;'-'&gt; : func_holder&lt;std::plus, noop_minus&gt; {};
template &lt;&gt; struct op2func&lt;'*'&gt; : func_holder&lt;noop_plus, std::multiplies&gt; {};
template &lt;&gt; struct op2func&lt;'/'&gt; : func_holder&lt;noop_plus, std::divides&gt; {};

template &lt;char what, int depth&gt; struct berechne
{
    template &lt;typename T&gt;
    void operator()(T* numbers, T partial_sum, T partial_product, std::string equation)
    {
        std::stringstream eq;
        eq &lt;&lt; equation &lt;&lt; ' ' &lt;&lt; what &lt;&lt; ' ' &lt;&lt; *numbers;
        partial_sum     = typename op2func&lt;what&gt;::template apply0&lt;T&gt;::type()( partial_product, partial_sum );
        partial_product = typename op2func&lt;what&gt;::template apply1&lt;T&gt;::type()( partial_product, *numbers );
        berechne&lt;'+', depth-1&gt;()( numbers + 1, partial_sum, partial_product, eq.str() );
        berechne&lt;'-', depth-1&gt;()( numbers + 1, partial_sum, partial_product, eq.str() );
        berechne&lt;'*', depth-1&gt;()( numbers + 1, partial_sum, partial_product, eq.str() );
        berechne&lt;'/', depth-1&gt;()( numbers + 1, partial_sum, partial_product, eq.str() );
    }
};

template &lt;char what&gt; struct berechne&lt;what, 0&gt;
{
    template &lt;typename T&gt;
    void operator()(T*, T, T, std::string)
    {}
};

template &lt;&gt; struct berechne&lt;'+', 0&gt;
{
    template &lt;typename T&gt;
    void operator()(T*, T partial_sum,  T partial_product, std::string equation)
    {
        std::cout &lt;&lt; equation &lt;&lt; &quot; = &quot; &lt;&lt; partial_sum + partial_product &lt;&lt; '\n';
    }
};

template &lt;typename T, std::size_t N&gt;
void run(T (&amp;numbers)[N])
{
    berechne&lt;' ', N&gt;()( numbers, T(), T(), std::string() );
}

int main()
{
    double numbers[] = { 1, 2, 3, 4 };
    run( numbers );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2142375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142375</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 09 Nov 2011 00:17:45 GMT</pubDate></item><item><title><![CDATA[Reply to Gleichungen als for-Schleife? on Wed, 09 Nov 2011 00:35:05 GMT]]></title><description><![CDATA[<p>Nett. Ich hätte allerdings nicht die Operatoren selbst als Schlüssel benutzt, sondern aufsteigende Zahlen, über die ich die Operatorzeichen nachschlagen kann - dann lässt sich das hübsch in einer Schleife machen.</p>
<p>Es ist jetzt nicht so schön templatisiert und auch nicht rekursiv, dafür hab ich aber Funktionszeiger drin:</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;
#include &lt;iostream&gt;
#include &lt;stack&gt;
#include &lt;vector&gt;

double add     (double x, double y) { return x + y; }
double subtract(double x, double y) { return x - y; }
double multiply(double x, double y) { return x * y; }
double divide  (double x, double y) { return x / y; }

struct calculation {
  char     op_char;
  unsigned priority;
  double (*calc)(double, double);
} const calculations[] = {
  { '+', 0, add      },
  { '-', 0, subtract },
  { '*', 1, multiply },
  { '/', 1, divide   }
};

template&lt;typename T, std::size_t N&gt;
inline std::size_t array_size(T(&amp;)[N]) { return N; }

bool next_combo(std::vector&lt;std::size_t&gt; &amp;data) {
  std::size_t max_value = array_size(calculations) - 1;

  ++data.back();
  for(std::size_t i = data.size() - 1; i != 0 &amp;&amp; data[i] &gt; max_value; --i) {
    data[i] = 0;
    ++data[i - 1];
  }

  return data[0] &lt;= max_value;
}

void perform_top_operation(std::stack&lt;double&gt; &amp;num_stack, std::stack&lt;calculation&gt; &amp;op_stack) {
  double x = num_stack.top(); num_stack.pop();
  double y = num_stack.top(); num_stack.pop();
  num_stack.push(op_stack.top().calc(y, x));
  op_stack.pop();
}

int main() {
  double numbers[] = { 1, 2, 3, 4 };
  std::vector&lt;std::size_t&gt; op_indices(array_size(numbers) - 1, 0);

  while(next_combo(op_indices)) {
    // Was folgt, ist der relevante Teil des Shunting-Yard-Algorithmus

    std::stack&lt;calculation&gt; op_stack;
    std::stack&lt;double&gt;      num_stack;

    num_stack.push(numbers[0]);

    for(std::size_t i = 0; i &lt; op_indices.size(); ++i) {
      calculation const &amp;current_calc = calculations[op_indices[i&rsqb;&rsqb;;

      while(!op_stack.empty() &amp;&amp; current_calc.priority &lt;= op_stack.top().priority) {
        perform_top_operation(num_stack, op_stack);
      }

      op_stack.push(current_calc);
      num_stack.push(numbers[i + 1]);
    }

    while(!op_stack.empty()) {
      perform_top_operation(num_stack, op_stack);
    }

    for(std::size_t i = 0; i &lt; op_indices.size(); ++i) {
      calculation const &amp;current_calc = calculations[op_indices[i&rsqb;&rsqb;;
      std::cout &lt;&lt; numbers[i] &lt;&lt; ' ' &lt;&lt; current_calc.op_char &lt;&lt; ' ';
    }

    std::cout &lt;&lt; numbers[op_indices.size()] &lt;&lt; &quot; = &quot; &lt;&lt; num_stack.top() &lt;&lt; '\n';
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2142401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2142401</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 09 Nov 2011 00:35:05 GMT</pubDate></item></channel></rss>