Zwei Vektoren vom Typ bool XOR-Verknüpfen



  • Hallo alle zusammen,

    ich habe eine Funktion geschrieben um zwei Vektoren vom Typ bool miteinander XOR zu verknüpfen:

    vector<bool> VecBoolXOR(vector<bool> a, vector<bool> b){
        vector<bool>::iterator VBI_A = a.begin();
        for(vector<bool>::iterator VBI_B = b.begin(); VBI_B != b.end(); ++VBI_B){
            *VBI_A = *VBI_A ^ *VBI_B;
            ++VBI_A;
        }
        return a;
    }
    

    Kennt jemand eine möglichkeit das ganze noch schneller zu lösen?
    Eventuell auch mit einer anderen Architektur als vector<bool>, sie muss jedoch Größenvariabel sein.

    Ich würde mich über jede antwort freuen.

    MfG Mars337



  • std::transform(a.begin(), a.end(), b.begin(), outputItr, std::bit_xor<bool>());
    


  • wenn es um geschwindigkeit geht, bist du uU mit vector<char> schneller als mit vector<bool>...



  • Boost.DynamicBitset dürfte etwas für dich sein. Ist garantiert schneller als vector<bool> und der vector<signed char> von Shade.

    Lässt sich sonst auch selber nachbauen.



  • Hey 🙂

    Danke an euch, habe direkt mal die Lösung von Nexus probiert, funktioniert einwandfrei 🙂

    Gibt es für diese Funktion auch die Möglichkeit nur Teile eines Vektors zu verwenden?

    Als Beispiel habe ich zwei Vektoren mit Zehn Elementen, möchte aber nur die Elemente 3-7 beider Vektoren XOR-Verknüpfen.

    Bis hier hin schonmal tausend Dank euch 🙂

    MfG Mars337



  • Mars337 schrieb:

    Hey 🙂

    Danke an euch, habe direkt mal die Lösung von Nexus probiert, funktioniert einwandfrei 🙂

    Gibt es für diese Funktion auch die Möglichkeit nur Teile eines Vektors zu verwenden?

    Als Beispiel habe ich zwei Vektoren mit Zehn Elementen, möchte aber nur die Elemente 3-7 beider Vektoren XOR-Verknüpfen.

    Bis hier hin schonmal tausend Dank euch 🙂

    MfG Mars337

    Ja natürlich! Wozu existiert denn das Iteratoren-Konzept?! Und dazu wird es noch einfacher, da die Iteratoren von std::vector random-access sind.

    Ich nehme mal an, du meinst ein rechtsoffenes Intervall [3, 7)? Also drittes Element inklusive, siebtes exklusive?

    std::transform(a.begin() + 2, 
                   a.end() + 6, 
                   b.begin() + 2, 
                   outputItr, 
                   std::bit_xor<bool>());
    


  • Ganz genau!
    Nochmals vielen Dank 🙂


Anmelden zum Antworten