2017-02-26 3 views
2

Ich habe folgende Struktur, die jedes Byte des hinzugefügten Elements in nachfolgenden Positionen des Vektors speichert:Bytes in Vektor C++

struct StashVector { 
    int size; // Size of each space 
    int next; // Next empty space 
       // Dynamically allocated array of bytes: 
    std :: vector<char> storage; 
    // Functions! 
    void initialize(int sz); 
    //void cleanup(); 
    int add(const void* element); 
    void* fetch(int index); 
    int count(); 
// void inflate(int increase); 
}; 

und seine Umsetzung:

void StashVector::initialize(int sz) { 
    size = sz;  
    next = 0; 
} 

int StashVector::add(const void* element) { 
    unsigned char* e = (unsigned char*)element; 
    for (int i = 0; i < size; i++) 
     storage.push_back(e[i]); 
    next++; 
    return(next-1); // Index number 
} 

void* StashVector::fetch(int index) { 
    assert(0 <= index); 

    if (index >= next) 
     return 0; // To indicate the end 
        // Produce pointer to desired element: 
    return &(storage.at(index*size)); 
} 

int StashVector::count() { 
    return storage.size()/size; 
} 

Ich will, es benutzen für ganze Zahlen in ihm wie so zu speichern:

int main() { 
    StashVector sv; 
    sv.initialize(sizeof(int)); 
    for (int i = 0; i < 5; i++) { 
     sv.add(&i); 
    } 

    for (int j = 0; j<sv.count(); j++) { 
     cout << *(int*)sv.fetch(j) << endl; 
    } 
} 

Hier kommt etwas, das ich nicht verstehe. Weil es das Bytes des Elements an verschiedenen Positionen in den vector speichert, die ersten vier Positionen in dem vector (sv.fetch(0), sv.fetch(1), sv.fetch(2), sv.fetch(3)) sollten 00000000000000000000000000000000, sein, die auf die Binärdarstellung von int als 0 äquivalent ist, aber wenn ich versuche, die Elemente des Vektors in der for-Schleife zu drucken, zeigt es die Zahlen direkt an. Ist es, weil ich es mit der sizeof(int) initiierte, druckt es 4 Bytes auf einmal?

Antwort

0

Ja, es druckt vier Bytes gleichzeitig, da Sie es zum Drucken von Ints fragen. Wenn Sie jedes Byte einzeln anzeigen möchten, können Sie den gesamten Vektor durchlaufen und jedes Element einzeln drucken. Es wäre dann eine gute Idee, das Zeichen vor dem Ausdrucken auf int zu setzen, so dass Sie die Nummer und nicht irgendein Steuerzeichen erhalten.

for (int n : sv.storage) 
    std::cout << n << std::endl; 

Live demo