vector<bool> serialisieren



  • Hi, ich verwende vector<bool> zur programminternen Bearbeitung eines Bitstroms. Nun möchte ich diesen Bitstrom aber gerne serialisieren, d.h. (eng gepackt!) in einen Bytestrom (char o.ä.) schreiben.

    Geht das, ohne dass ich die Bits über einen Iterator einzeln auslesen und die Bitpositionen errechnen muss? Denn im Vektor sind die Bits dank Spezialisierung auf bool ja schon dicht gepackt, diese wieder auszulesen und neu zu packen wäre ein nicht geringer Performanceverlust.



  • serialisieren heißt abspeichern, nicht packen!!



  • serialprofi schrieb:

    serialisieren heißt abspeichern, nicht packen!!

    Gut erkannt. "gepackt" hatte ich auch nur geschrieben, damit nicht jemand folgenden (oder einen ähnlichen) Weg hier postet:

    std::string bool_vec_to_s(std::vector<bool> in)
    {
        std::stringstream ret;
        std::copy(in.begin(), in.end(), std::ostream_iterator<bool, char>(ret, ""));
        return ret.str();
    }
    

    Denn dann werden die einzelnen Werte ja zu einzelnen Zeichen serialisiert.



  • Ich bezweifel mal, das vector<bool> seine elemente als bits speichert.
    Sondern wird wohl für jedes element ein byte reserviert.
    Du hast also 2 Möglichkeiten:
    1. Die bits selber in ein char zu schreiben, und dieses dann abzuspeichern.
    2. ein Vernünftiges BitArray benutzen, welches direkt als Bit die bools abspeichert,
    z.b. volkards BitField könnte da einen Blick wert sein.



  • phlox81 schrieb:

    Ich bezweifel mal, das vector<bool> seine elemente als bits speichert.
    Sondern wird wohl für jedes element ein byte reserviert.

    Stroustrup, schrieb:

    Die Klasse vector<bool> kann allerdings ziemlich einfach so implementiert werden, daß jedes Element nur ein Bit braucht.

    Und meinen Informationen nach handhaben das die meisten Implementierungen auch so.

    z.b. volkards BitField könnte da einen Blick wert sein.

    Danke für den Tip, schaue ich mal. Mal davon gibt es ja auch std::bitset ... aber ich dachte halt, vector<bool> wäre ganz fein zu benutzen.


  • Mod

    phlox81 schrieb:

    Ich bezweifel mal, das vector<bool> seine elemente als bits speichert.

    und warum dann der ganze rummel um vector<bool,std::allocator<bool> >, der kein container ist und auch keine bools speichert 😉

    eine legale möglichkeit an die interne representation zu kommen, dürfte es nicht geben; &v[i] geht ja nicht. du könntest einen adapter schreiben, der sich wie vector<bool> verhält aber eben auch direkten zugriff auf das darunterliegende array erlaubt. andererseits, wenn es um geschwindigkeit geht, ist vector<bool> sowieso eine schlechte wahl.



  • Ein vector<bool> muss die Werte nicht als Bits speichern, deshalb bietet er eben keinen Zugriff auf Byte-Blöcke mit den Werten. Wenn man nun die Werte sicher als Bits haben will, kostet das halt Performance und geht nicht, ohne die Werte einzeln anzupacken:

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void serialize(vector<char> &result, const vector<bool> &vec)
    {
    	vector<bool>::const_iterator iter = vec.begin();
    	for(int j=0; iter != vec.end(); ++j)
    	{
    		result.push_back(0);
    		for (int i=0; i<8 && iter != vec.end(); ++i, ++iter)
    			result[j] |= (*iter<<i);
    	}
    }
    
    int main()
    {
    	vector<bool> v1;
    	vector<char> v2;
    
    	//1011 = 11
    	v1.push_back(true);
    	v1.push_back(true);
    	v1.push_back(false);
    	v1.push_back(true);
    	v1.push_back(false);
    	v1.push_back(false);
    	v1.push_back(false);
    	v1.push_back(false);
    
    	//1001 = 9
    	v1.push_back(true);
    	v1.push_back(false);
    	v1.push_back(false);
    	v1.push_back(true);
    
    	serialize(v2, v1);
    
    	cout << (int)v2[0] << endl;
    	cout << (int)v2[1] << endl;
    
    	cin.get();
    }
    

Anmelden zum Antworten