2016-06-01 4 views
0

bitte helfen Sie mir diesen Fall zu verstehen, mit:
ich zu einem vector von struct in einem Projekt zum Speichern von Daten arbeitete, mein Ziel ist es, sich am Leben zu halten, bis Ich rufe eine Funktion auf, um mit den Daten zu arbeiten, und lösche sie dann in der Warteschlange. Aber mein Problem ist, ich weiß nicht, wie man das Element in Vektor sicher löscht, wenn ich den struct unter Verwendung new Operators zuteile.
Beispiel:
ein Element im Vektor löscht, die allocted wird ‚neuen‘ Betreiber

//definition of truct 
struct MData { 
    int dHeight; 
    int dWidth; 
}; 

//definition of queue 
std::vector< MData* > dataQueue; 

Dies ist, wie ich speichern Daten in der Warteschlange:

//when got the data 
MData* mData = new MData; 
mData->dHeight = sourceHeight; 
mData->dWidth = sourceWidth; 

//Then put it in the queue 
dataQueue.push_back(MData); 

Nach der Berechnung, möchte ich das erste Element in der Warteschlange
So löschen Welche Methode sollte ich verwenden: delete dataQueue.front()? um die Erinnerung zu befreien. Oder mit dataQueue.erase(dataQueue.front())?
Vielen Dank im Voraus.

+0

Ich denke, Sie haben einen Typfehler - Ihr std :: vector hat MDatas (die tatsächliche Struktur), aber Sie versuchen, einen Zeiger auf MData zu schieben. Das wird nicht funktionieren. Um eine Struktur zu bereinigen, die von new zugewiesen wurde, versuchen Sie, sie zuerst von der Liste zu entfernen und dann den Zeiger zu löschen. (Sie müssen es nicht in zwei Schritten tun, aber es macht es einfacher zu sehen, was vor sich geht.) –

+0

dataQueue.push_back (MData); 'wird nicht kompiliert, weil' MData' eine Struktur und kein Objekt ist. 'mData-> dWidth = sourceWidth' wird nicht kompiliert, weil Sie das Semikolon vergessen haben. So bin ich 100% sicher, dass das ** nicht ** wie Sie Daten in der Warteschlange speichern. – immibis

+0

Sorry, Jungs, ich habe zu diesem Zeitpunkt noch keinen Compiler, den ich gerade schreibe, ich schreibe einfach den obigen Code. Ich habe diese Fehler bearbeitet. –

Antwort

4

Warum würden Sie vergeben MData mit new? Es ist klein genug, dass Sie es einfach im automatischen Speicher reservieren können, zumal Ihre dataQueue bereits definiert ist, um MData Instanzen nach Wert (und nicht durch Zeiger) zu halten. Also:

MData mData{sourceHeight, sourceWidth}; 
dataQueue.push_back(mData); 
+4

oder 'dataQueue.push_back ({sourceHeight, sourceWidth});' oder 'dataQueue.emplace_back (sourceHeight, sourceWidth);' –

+0

Hinweis für das OP: In diesem Fall wird mData in den Vektor kopiert, auf den nicht verwiesen oder verschoben wird. –

0

Sie mit der C++ STL Warteschlange Bibliothek Unter der Annahme,

MData* firstelement = dataQueue.front(); 
dataQueue.pop(); 
delete firstelement; 

Edit: wie von Dave wies darauf hin, müssen Sie den Vektor wie folgt definieren:

std::vector< MData* > dataQueue; 
+1

Nein, es ist besser, 'std :: vector ' (speichert die 'MData' nach Wert) als' std :: vector '(Speichern der' MData' durch _raw_ Zeiger). Container mit einem rohen Zeiger sind ein Antipattern. Wenn Sie einen Container mit Zeigern verwenden müssen, verwenden Sie einen intelligenten Zeiger wie 'std :: unique_ptr'. Aber in diesem Fall wird es nicht benötigt (es ist nur eine Struktur mit 2 'int's); Speichern nach Wert ist besser. –

+1

'MData firstelement' sollte' MData * firstElement' sein –

+0

Entschuldigung, mein Fehler. Danke, dass du das unterstrichen hast! –

1

Da Sie das Objekt innerhalb des Vektors und keine Notwendigkeit, außerhalb zu leben verwenden wollen, ist die beste Praxis in den Vektor direkt in Stellung zu bringen:

struct MData { 
     MData(const int dHeight,const int dWidth):dHeight(dHeight),dWidth(dWidth){} 
     int dHeight; 
     int dWidth; 
    }; 
    std::vector<MData> dataQueue; 
    dataQueue.emplace_back(sourceHeight,sourceWidth); 

Online Demo

Verwandte Themen