2009-06-07 7 views
0
CODE: 

struct Stringdata 
{ 
    // Length of data in buffer. 
    size_t len; 
    // Allocated size of buffer. 
    size_t alc; 
    // Buffer. 
    char data[1]; 
}; 

typedef std::list<Stringdata*> Stringdata_list; 
Stringdata_list strings_; 

Stringdata *psd = this->strings_.front(); 

//... 
if (len > psd->alc - psd->len) 
alc = sizeof(Stringdata) + buffer_size; 
else 
{ 
    char* ret = psd->data + psd->len; 
    memcpy(ret, s, len - sizeof(Stringpool_char)); 
    memset(ret + len - sizeof(Stringpool_char), 0, 
    sizeof(Stringpool_char)); 

    psd->len += len; 

    return reinterpret_cast<const Stringpool_char*>(ret); 
} 

In dem Codebeispiel oben eingeführt wird, habe ich in der sonstEine Frage zu Element in STL Liste

Zweig über die Operationen verwechselt.

Erzeugt es ein neues Element und fügt es nach dem Frontelement ein oder fügt einfach ein neues Element in das erste Element der Liste ein?

Antwort

1

Ihr Code scheint weder zu tun noch. Der Code im Zweig else ändert die Struktur strings_ überhaupt nicht. Der Code ändert nur die Rückgabe des Elements vom Anfang der Liste. Dies sollte keinen Einfluss auf die tatsächliche Listenstruktur haben.

+0

Es ist eine Liste von Zeigern, so wird es modifiziert das Ding von der Element-Front-Liste hingewiesen. –

+0

@Neil: Wenn die neue Liste iteriert wird, muss sich die modifizierte Liste um das erste Element kümmern oder wie gewohnt iterieren? – Kim

+0

@Neil, ja, aber dies sollte die Struktur der Liste in Bezug auf die Reihenfolge nicht beeinflussen. Das scheint der OP zu sein. – JaredPar

0

Es erstellt kein neues Element - fügt nur Daten von s an die Daten an, die bereits im Frontelement vorhanden sind, wenn Platz vorhanden ist. Sehr verwirrend geschriebener Code.

0

Soweit ich das beurteilen kann (einige wichtige Code fehlt in Ihrem Auszug), haben Sie einen Block von Daten, die im Wesentlichen ein Array von Stringdata-Objekt ist, und eine Liste <> von Zeigern in diesen Block. Der else-Block erweitert dieses Array.

Sie wahrscheinlich wäre besser dran mit einem vector<Stringdata> eher als ein list<Stringdata*>