<?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 manipulieren]]></title><description><![CDATA[<p>Hi,<br />
ich möchte gerne Vector &quot;labelsInRegions&quot; dahingehend manipulieren, dass ich die darin enthaltenen Vektoren zusammenführen und andere wiederum löschen möchte. Das mit dem Löschen klappt gut, nur das Zusammenführen nicht.<br />
Im Code werden labelSetA und labelSetB zusammengeführt, die wiederum in labelsInRegions enthalten sind. Iteriere ich durch labelSetA, dann sehe ich, dass die Vereinigung geklappt hat. Iteriere ich durch labelsInRegions, also der Obermenge, dann sehe ich, dass das fehlgeschlagen hat.<br />
Ich vermute, dass mir die Funktion getLabelSet() eine Kopie eines Iterators gibt, der woanders hinzeigt. Dass der Iterator eine Kopie ist, ist klar, aber ich dachte, er zeigt innerhalb labelsInRegions.</p>
<p>Weiß jemand weiter?</p>
<pre><code>static vector&lt; vector&lt;unsigned char&gt; &gt; resolveLabelCollisions(vector&lt;pair&lt;unsigned char, unsigned char&gt; &gt;&amp; collisions, const unsigned char amountLabels, const unsigned char labelBegin)
{
    vector&lt; vector&lt;unsigned char&gt; &gt; labelsInRegions;

    // Create a partitioning of the labels as a vector of sets, one set for each label
    for (int label = labelBegin; label &lt; amountLabels; label++) {
        vector&lt;unsigned char&gt; labelSet;
        labelSet.push_back(label);

        labelsInRegions.push_back(labelSet);
    }

    vector&lt; pair&lt;unsigned char, unsigned char&gt; &gt;::iterator itCollisions;

    for (itCollisions = collisions.begin(); itCollisions != collisions.end(); itCollisions++) {
        pair&lt;unsigned char, unsigned char&gt; collision = *itCollisions;

        // Get the label set that contains A
        vector&lt;unsigned char&gt; labelSetA = *getLabelSet(labelsInRegions.begin(), labelsInRegions.end(), collision.first);

        // Get the label set that contains B
        vector&lt; vector&lt;unsigned char&gt; &gt;::iterator itLabelSetB = getLabelSet(labelsInRegions.begin(), labelsInRegions.end(), collision.second);
        vector&lt;unsigned char&gt; labelSetB = *itLabelSetB;

        // Union of labelSetA and labelSetB.
        labelSetA.insert(labelSetA.end(), labelSetB.begin(), labelSetB.end());

        // Notiz: Union von labelSetA hat zwar funktioniert, hat aber keine Auswirkungen auf labelsInRegions.

        // Delete labelSetB
        labelsInRegions.erase(itLabelSetB);
    }

    return labelsInRegions;
}

static vector&lt; vector&lt;unsigned char&gt; &gt;::iterator getLabelSet(vector&lt; vector&lt;unsigned char&gt; &gt;::iterator begin, vector&lt; vector&lt;unsigned char&gt; &gt;::iterator end, unsigned char labelToBeSearched)
{
    vector&lt; vector&lt;unsigned char&gt; &gt;::iterator itRegions;

    for (itRegions = begin; itRegions != end; itRegions++) {    
        vector&lt;unsigned char&gt; labels = *itRegions;
        vector&lt;unsigned char&gt;::iterator itLabels;

        for (itLabels = labels.begin(); itLabels != labels.end(); itLabels++) {
            unsigned char label = *itLabels;

            if (label == labelToBeSearched) {
                return itRegions;
            }
        }
    }

    char errorMsg[90];
    sprintf(errorMsg, &quot;mxSequentialLabeling.cpp: label %u not found in function getLabelSet()&quot;, labelToBeSearched);
    mexErrMsgTxt(errorMsg);
}
</code></pre>
<p>Danke, im Voraus.</p>
<p>Gruß,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/325714/vector-manipulieren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 21:59:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/325714.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 May 2014 20:56:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vector manipulieren on Wed, 14 May 2014 20:56:09 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich möchte gerne Vector &quot;labelsInRegions&quot; dahingehend manipulieren, dass ich die darin enthaltenen Vektoren zusammenführen und andere wiederum löschen möchte. Das mit dem Löschen klappt gut, nur das Zusammenführen nicht.<br />
Im Code werden labelSetA und labelSetB zusammengeführt, die wiederum in labelsInRegions enthalten sind. Iteriere ich durch labelSetA, dann sehe ich, dass die Vereinigung geklappt hat. Iteriere ich durch labelsInRegions, also der Obermenge, dann sehe ich, dass das fehlgeschlagen hat.<br />
Ich vermute, dass mir die Funktion getLabelSet() eine Kopie eines Iterators gibt, der woanders hinzeigt. Dass der Iterator eine Kopie ist, ist klar, aber ich dachte, er zeigt innerhalb labelsInRegions.</p>
<p>Weiß jemand weiter?</p>
<pre><code>static vector&lt; vector&lt;unsigned char&gt; &gt; resolveLabelCollisions(vector&lt;pair&lt;unsigned char, unsigned char&gt; &gt;&amp; collisions, const unsigned char amountLabels, const unsigned char labelBegin)
{
    vector&lt; vector&lt;unsigned char&gt; &gt; labelsInRegions;

    // Create a partitioning of the labels as a vector of sets, one set for each label
    for (int label = labelBegin; label &lt; amountLabels; label++) {
        vector&lt;unsigned char&gt; labelSet;
        labelSet.push_back(label);

        labelsInRegions.push_back(labelSet);
    }

    vector&lt; pair&lt;unsigned char, unsigned char&gt; &gt;::iterator itCollisions;

    for (itCollisions = collisions.begin(); itCollisions != collisions.end(); itCollisions++) {
        pair&lt;unsigned char, unsigned char&gt; collision = *itCollisions;

        // Get the label set that contains A
        vector&lt;unsigned char&gt; labelSetA = *getLabelSet(labelsInRegions.begin(), labelsInRegions.end(), collision.first);

        // Get the label set that contains B
        vector&lt; vector&lt;unsigned char&gt; &gt;::iterator itLabelSetB = getLabelSet(labelsInRegions.begin(), labelsInRegions.end(), collision.second);
        vector&lt;unsigned char&gt; labelSetB = *itLabelSetB;

        // Union of labelSetA and labelSetB.
        labelSetA.insert(labelSetA.end(), labelSetB.begin(), labelSetB.end());

        // Notiz: Union von labelSetA hat zwar funktioniert, hat aber keine Auswirkungen auf labelsInRegions.

        // Delete labelSetB
        labelsInRegions.erase(itLabelSetB);
    }

    return labelsInRegions;
}

static vector&lt; vector&lt;unsigned char&gt; &gt;::iterator getLabelSet(vector&lt; vector&lt;unsigned char&gt; &gt;::iterator begin, vector&lt; vector&lt;unsigned char&gt; &gt;::iterator end, unsigned char labelToBeSearched)
{
    vector&lt; vector&lt;unsigned char&gt; &gt;::iterator itRegions;

    for (itRegions = begin; itRegions != end; itRegions++) {    
        vector&lt;unsigned char&gt; labels = *itRegions;
        vector&lt;unsigned char&gt;::iterator itLabels;

        for (itLabels = labels.begin(); itLabels != labels.end(); itLabels++) {
            unsigned char label = *itLabels;

            if (label == labelToBeSearched) {
                return itRegions;
            }
        }
    }

    char errorMsg[90];
    sprintf(errorMsg, &quot;mxSequentialLabeling.cpp: label %u not found in function getLabelSet()&quot;, labelToBeSearched);
    mexErrMsgTxt(errorMsg);
}
</code></pre>
<p>Danke, im Voraus.</p>
<p>Gruß,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399218</guid><dc:creator><![CDATA[IBV]]></dc:creator><pubDate>Wed, 14 May 2014 20:56:09 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Wed, 14 May 2014 21:38:22 GMT]]></title><description><![CDATA[<p>IBV schrieb:</p>
<blockquote>
<p>Iteriere ich durch labelsInRegions, also der Obermenge, dann sehe ich, dass das fehlgeschlagen hat.</p>
</blockquote>
<p>Du hast ja auch nur deine beiden lokalen Kopien zusammengeführt, die du in Zeilen 19 und 22 erstellt hast. Dir ist schon klar, dass dort keine Iteratoren mehr sind, da du den zurück gegebenen Iterator dereferenzierst?</p>
<p>Allgemein: Dein Code sieht umständlich aus. Da werden haufenweise versteckte Kopien von teuer zu kopierenden Objekten erstellt, bald darauf wieder verworfen und insgesamt passiert aber nicht viel. Genau das, was C-Programmierer denken, was der große Nachteil an C++ wäre. Und meistens falsch liegen, aber hier nicht.</p>
<p>Was soll der Code denn insgesamt machen? Das kann man sicherlich auch wesentlich einfacher (und lesbarer!) erreichen. Sind eventuell auch die Datenstrukturen ungeeignet? An einigen Stelle in deinem Code schreit es für mich geradezu nach einem set/multiset. Und mittels des bewährten Duos aus Templates und Iteratoren könnte man alles viel schöner schreiben, ohne die vieln verschachtelten vector&lt;vector&lt;typ&gt;&gt;.</p>
<p>&quot;amount&quot; heißt übrigens so viel wie &quot;Menge&quot; oder &quot;Größe&quot;, nicht &quot;Anzahl&quot;. Du suchst &quot;number of&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399221</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399221</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 14 May 2014 21:38:22 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Wed, 14 May 2014 21:53:21 GMT]]></title><description><![CDATA[<p>Hi SeppJ,</p>
<p>also erst mal:</p>
<p><a href="http://www.angelfoodcomic.com/wp-content/uploads/I-have-no-idea-what-I-am-doing.jpg" rel="nofollow">http://www.angelfoodcomic.com/wp-content/uploads/I-have-no-idea-what-I-am-doing.jpg</a></p>
<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="🙂"
    /></p>
<p>C++ hatte ich nie gelernt nur Java und C.</p>
<p>Ich versuche das hier umzusetzen:</p>
<p><a href="http://books.google.de/books?id=3u5hboQaJAYC&amp;pg=PA202&amp;lpg=PA200&amp;dq=Die+sequentielle+Regionenmarkierung+ist+eine+klassische,+nicht+rekursive&amp;source=bl&amp;ots=4BExWq6RpB&amp;sig=h3VAnOz8RdEqb2C3AopmeIR_L7Y&amp;hl=de&amp;sa=X&amp;ei=oORzU_rEE-ab1AWY_YCIAQ&amp;ved=0CDUQ6AEwAA#v=onepage&amp;q=Die%20sequentielle%20Regionenmarkierung%20ist%20eine%20klassische%2C%20nicht%20rekursive&amp;f=false" rel="nofollow">http://books.google.de/books?id=3u5hboQaJAYC&amp;pg=PA202&amp;lpg=PA200&amp;dq=Die+sequentielle+Regionenmarkierung+ist+eine+klassische,+nicht+rekursive&amp;source=bl&amp;ots=4BExWq6RpB&amp;sig=h3VAnOz8RdEqb2C3AopmeIR_L7Y&amp;hl=de&amp;sa=X&amp;ei=oORzU_rEE-ab1AWY_YCIAQ&amp;ved=0CDUQ6AEwAA#v=onepage&amp;q=Die sequentielle Regionenmarkierung ist eine klassische%2C nicht rekursive&amp;f=false</a></p>
<p>Verstehe ich richtig, dass bei Zeile 20 und 22 der komplette Vektor mit allen seinen Elementen kopiert wird?!</p>
<p>Gruß,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399222</guid><dc:creator><![CDATA[IBV]]></dc:creator><pubDate>Wed, 14 May 2014 21:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Wed, 14 May 2014 22:46:31 GMT]]></title><description><![CDATA[<p>IBV schrieb:</p>
<blockquote>
<p>Ich versuche das hier umzusetzen:</p>
<p><a href="http://books.google.de/books?id=3u5hboQaJAYC&amp;pg=PA202&amp;lpg=PA200&amp;dq=Die+sequentielle+Regionenmarkierung+ist+eine+klassische,+nicht+rekursive&amp;source=bl&amp;ots=4BExWq6RpB&amp;sig=h3VAnOz8RdEqb2C3AopmeIR_L7Y&amp;hl=de&amp;sa=X&amp;ei=oORzU_rEE-ab1AWY_YCIAQ&amp;ved=0CDUQ6AEwAA#v=onepage&amp;q=Die%20sequentielle%20Regionenmarkierung%20ist%20eine%20klassische%2C%20nicht%20rekursive&amp;f=false" rel="nofollow">http://books.google.de/books?id=3u5hboQaJAYC&amp;pg=PA202&amp;lpg=PA200&amp;dq=Die+sequentielle+Regionenmarkierung+ist+eine+klassische,+nicht+rekursive&amp;source=bl&amp;ots=4BExWq6RpB&amp;sig=h3VAnOz8RdEqb2C3AopmeIR_L7Y&amp;hl=de&amp;sa=X&amp;ei=oORzU_rEE-ab1AWY_YCIAQ&amp;ved=0CDUQ6AEwAA#v=onepage&amp;q=Die sequentielle Regionenmarkierung ist eine klassische%2C nicht rekursive&amp;f=false</a></p>
</blockquote>
<p>Die Benutzen den Ausdruck &quot;set&quot; dort nicht ohne Grund. Zwar ist ein Set im Sinne einer mathematischen Menge gemeint, aber eine gute Umsetzung eines Sets in C++ ist eben nicht der vector, sondern das set (oder einer seiner Verwandten, wie multiset, unordered_set &amp; Co.)</p>
<blockquote>
<p>Verstehe ich richtig, dass bei Zeile 20 und 22 der komplette Vektor mit allen seinen Elementen kopiert wird?!</p>
</blockquote>
<p>Ja. In C++ sind Variablen keine Verweise auf Objekte wie in Java. Das ist ein ganz wichtiger Unterschied und mit einer der Gründe, warum C++-Code oft so viel schneller ist als Java. Leider erreicht man aber den gegenteiligen Effekt, wenn man dies nicht weiß und erzeugt dann ungewollt viele, langsame Kopieraktionen. Ganz zu schweigen natürlich davon, dass das Programm nicht richtig funktioniert. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399225</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 14 May 2014 22:46:31 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Thu, 15 May 2014 05:34:34 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<blockquote>
<p>Verstehe ich richtig, dass bei Zeile 20 und 22 der komplette Vektor mit allen seinen Elementen kopiert wird?!</p>
</blockquote>
<p>Ja. In C++ sind Variablen keine Verweise auf Objekte wie in Java. Das ist ein ganz wichtiger Unterschied und mit einer der Gründe, warum C++-Code oft so viel schneller ist als Java.</p>
</blockquote>
<p>Ich komme aber nicht umhin die Iteratoren zu dereferenzieren. Irgendwie muss ich ja auf die Vektoren zugreifen die ich vereinigen und löschen will.<br />
Wie wäre die korrekte Umsetzung?</p>
<p>Gruß,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399238</guid><dc:creator><![CDATA[IBV]]></dc:creator><pubDate>Thu, 15 May 2014 05:34:34 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Thu, 15 May 2014 16:34:29 GMT]]></title><description><![CDATA[<p>Ich habe das Problem dahingehend gelöst, dass getLabelSet() nun den Index des gesuchten Labels zurückgibt. Außerdem muss ich überprüfen, ob Set A und B unterschiedlich sind, sonst wird A in A kopiert und anschließend gelöscht. :p</p>
<p>Gruß,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399347</guid><dc:creator><![CDATA[IBV]]></dc:creator><pubDate>Thu, 15 May 2014 16:34:29 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Thu, 15 May 2014 17:30:33 GMT]]></title><description><![CDATA[<p>IBV schrieb:</p>
<blockquote>
<p>Ich komme aber nicht umhin die Iteratoren zu dereferenzieren. Irgendwie muss ich ja auf die Vektoren zugreifen die ich vereinigen und löschen will.<br />
Wie wäre die korrekte Umsetzung?</p>
</blockquote>
<p>Das Dereferenzieren der Iteratoren ist nicht das Problem. Dadurch erhältst du einen Verweis auf das referenzierte Objekt. Aber dann machst du eine Kopie von diesem Verweis. Benutz nur so etwas wie die Zeile 22. <strong>Nicht</strong> so wie Zeile 23 oder 19. Dann arbeite mit den Iteratoren.</p>
<p>Außerdem solltest du den Tipp mit dem set ernster nehmen. Das vereinfacht deinen Code <strong>wesentlich</strong>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399359</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 15 May 2014 17:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Thu, 15 May 2014 17:40:10 GMT]]></title><description><![CDATA[<p>Hi,<br />
könntest du deinen Tipp mit dem set genauer erläutern?</p>
<p>Als Vorteile fallen mir ein:</p>
<p>- keine doppelten Elemente<br />
- Elemente sind sortiert</p>
<p>Inwiefern kommen diese Vorteile zum Tragen? Ich habe auf set verzichtet, weil ich davon ausging, dass die oben genannten Features Performance-Nachteile haben.</p>
<p>Gruß,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399360</guid><dc:creator><![CDATA[IBV]]></dc:creator><pubDate>Thu, 15 May 2014 17:40:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Fri, 16 May 2014 22:00:20 GMT]]></title><description><![CDATA[<p>Ich weiß nicht genau, ob und wie ein <code>std::set</code> jetzt die gesamte Sache vereinfacht.<br />
Aber Dein Code würde sich einfacher lesen lassen mit ein paar typedefs oder using Deklarationen.<br />
Beispielsweise using aus C++11</p>
<pre><code class="language-cpp">using label = int;
using collision = std::pair&lt;label, label&gt;;
</code></pre>
<p>Wenn Du von Java kommst bist Du ja mit einer reichen Standardbibliothek vertraut: schau wo C++ ähnliches bietet um den Algorithmus aus dem Buch zu implementieren.<br />
Dein <code>getLabelSet()</code> z.B. schaut arg umständlich aus.</p>
<p>C++11 nutzen ( <code>auto</code> !) wenn möglich!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399550</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 16 May 2014 22:00:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Sat, 17 May 2014 00:20:33 GMT]]></title><description><![CDATA[<p>Hi,<br />
danke, aber C++11 kann ich aus Kompatibilitätsgründen nicht benutzen.</p>
<p>Gruß,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399555</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 17 May 2014 00:20:33 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Sat, 17 May 2014 17:18:53 GMT]]></title><description><![CDATA[<p>IBV schrieb:</p>
<blockquote>
<p>Hi,<br />
danke, aber C++11 kann ich aus Kompatibilitätsgründen nicht benutzen.</p>
<p>Gruß,<br />
IBV</p>
</blockquote>
<p>Das geht auch mit typedef genau so.</p>
<pre><code>typedef unsigned char Label;
typedef pair&lt;Label, Label&gt; Collision;
// usw.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2399636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399636</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 17 May 2014 17:18:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vector manipulieren on Sat, 17 May 2014 18:52:42 GMT]]></title><description><![CDATA[<p>Ahja, da war was! <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="🙂"
    /> Thx.</p>
<p>Gruß,<br />
IBV</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2399660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2399660</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 17 May 2014 18:52:42 GMT</pubDate></item></channel></rss>