Vektor leeren...
-
l-value schrieb:
Tachyon schrieb:
oder mit
vec.swap(std::vector<T>())
.Das geht anders.
std::vector<T>().swap(vec);
Jo, sowas passiert, wenn man vor dem erstem Kaffee versucht, schlau zu sein.
-
Tachyon schrieb:
l-value schrieb:
Tachyon schrieb:
oder mit
vec.swap(std::vector<T>())
.Das geht anders.
std::vector<T>().swap(vec);
Jo, sowas passiert, wenn man vor dem erstem Kaffee versucht, schlau zu sein.
Und was ist der Vorteil gegenüber .clear()?
Außer "Hey, alle mal kucken was ich kann".
-
Cooler schrieb:
Außer "Hey, alle mal kucken was ich kann".
Es wird bei der Methode auch die Kapazität des Vektors zurückgesetzt, was bei clear() nicht der Fall ist.
-
Cooler schrieb:
...schwall...
Guck Dir mal More C++ Idioms. Da stehen nicht nur viele coole Dinge, sondern auch gleich noch, warum sie so cool sind.
Das hier benutzte Idiom ist "Clear-and-minimize".
-
Und es ist nicht unbedingt ein Vorteil, den swap-Trick zu benutzen. Es macht einfach was anderes. Vielleicht will man das, vielleicht auch nicht.
-
Danke zusammen...
Habe beide Wege ausprobiert, nur leider kommt es beim Programmlauf zur in beiden Fällen "abnormal program termination".
Ich poste mal mehr vom Quelltext:
vector<string> lin; if (( z = strstr( Zeile, " SCHR1:" )) != NULL) // Suchen des Anfangs zum speichern { if ((z = strstr( Zeile, "ENDLABEL:" )) != NULL) {}else{ f=1;} } if (( z = strstr( Zeile, "ENDLABEL:" )) != NULL) // Ende des Speicherns { if ((z = strstr( Zeile, " SCHR1:" )) != NULL) {}else{ f=0;} } if (f==1) // Solange f==1 Speichern der Zeilen in vector { if (( z = strstr( Zeile, " SCHR1:" )) != NULL) {}else{ lin.push_back(Zeile); g++;} } if( strstr(Zeile,"ANZAHLAUSGABEN") ) // Suchen des Parameters der Ausgaben { t = Zeile; int pos = t.find("="); // Umwandlung String in Zahl if(pos != string::npos) { sub = t.substr (pos + 1); Str << sub; Str >> h; } for(m=1; m <= h ; m++) // Ausgabe der gespeicherten Vektoren { for(i=0; i < g; i++) {fprintf(fpOut,"%s", lin.at(i).c_str());} } lin.clear(); // Löschen des Vektors }
Es wird hier eine Textdatei zeilenweise Eingelesen, die zum Beispiel so aussieht:
SCHR1:
Hallo
Du
DA
ENDLABEL:
ANZAHLAUSGABEN=4Es sollen dann die Zeilen "Hallo", "Du" und "DA" viermal ausgegeben werden. Hat bis jetzt auch gut funktioniert, nur das dieser Programmabschnitt später noch einmal kommt. Dann fügt er aber die neuen Programmteile nur an den Vektor an.
Gibt es einen offensichtlichen Fehler, der zum Fehler führt ?
-
g
undlin.size()
könnten beim zweiten Durchlauf zum Beispiel nicht mehr zusammen passen. Da man aber bei den meisten Variablen nicht sieht, wo sie her kommen, ist das schwer zu sagen.
-
Warum soll das nicht gehen?
vec.swap(std::vector<T>());
Gerade in C++0x gibts dann den vector-Member.
void swap(T&& rhs)
-
Tachyon hatte Recht...Es lag an "g", musste ich natürlich auch wieder zurücksetzen...
Danke euch !
-
l-value schrieb:
Das geht anders.
std::vector<T>().swap(vec);
Es hat schon seinen Grund, warum
clear()
nicht auf diese Weise implementiert ist. Meist verwendet man denstd::vector
nach einemclear()
nämlich weiter und kann sich so Allokationen einsparen.Man kann den Swap-Trick benutzen, wenn man genau weiss, was man tut, und seine Gründe dafür hat. Doch generell sollte man die vorgefertigten Mechanismen verwenden.
einwurf schrieb:
Warum soll das nicht gehen?
vec.swap(std::vector<T>());
Weil temporäre Objekte nicht an Referenzen auf veränderbare Objekte gebunden werden können.