vector.empty
-
Hallo!
ich habe gerade ein problem mit vektoren. und zwar möchte ich einfach abfragen, ob mein vektor leer ist, oder ob bereits werte drinstehen.
vector<double> a(5);
a.empty()dann bekomme ich heraus, dass mein vektor nicht leer ist. schreibe ich aber
vector<doubel> a(0);
ist er leer.ich dachte die zahl in klammer ist die kapazität und hat nichts mit dem inhalt zu tun?!?
was mache ich falsch?
-
hallo nochmal!
ich bekomme bei a.size und a.capacity das selbe heraus. da stimmt doch etwas nicht und ich weiß nicht was.
-
hi.
das problem hab ich auch. weiß aber leider auch nicht was falsch ist.
-
Bloß weil die Elemente des vectors (noch) nicht belegt/benutzt worden sind, heißt das nicht dass sie gar nicht da wären, wenn man eine InitialCapacity ungleich 0 angibt.
-
wie kann ich dann die richtige Anzahl der Elemente, die sich im Vektor befinden (also bereits belegt sind) abfragen?
-
std::vector::size
-
Wenn Du einen std::vector<T> mit einem size_t-Argument erzeugst, wird er mit n Elementen angelegt. Die Elemente werden mit T() initialisiert. Seine size beträgt dann also schon n.
.size() liefert Dir jederzeit die richtige Größe des Vektors.
Du solltest lernen, mit diesen beiden Links hier umzugehen
http://www.cppreference.com/
http://www.sgi.com/tech/stl/table_of_contents.html
-
Hi!
Ich habe gerade mal in der MSDN gestöbert, okay, dass muss noch lange nicht Standard STL-konform sein, aber ich möchte meine Erkenntnisse doch preisgeben:
Der Konstruktor ist wie folgt definiert:
explicit vector(size_type n, const T& v = T(), const A& al = A());
Wie Du am
const T& v = T()
erkennen kannst, wird der Standardkonstruktor zum jeweiligen Typ verwendet, wenn man nichts weiter angibt.
Dies spricht eindeutig für das Verhalten, wes Dein Code aufweist. Würde nämlich nur Speicher reserviert werden, so bräuchtest Du keine Objekte konstruieren.
Bleibt nur alternativ:
vector<double> v; v.reserve(5);
oder
vector<double> v(5); v.clear();
Grüße
RichieP.S.: Ich denke, dass diese Antwort suboptimal ist, freue mich aber schon auf die Kommentare der C++-Gurus
-
Dies spricht eindeutig für das Verhalten, wes Dein Code aufweist. Würde nämlich nur Speicher reserviert werden, so bräuchtest Du keine Objekte konstruieren.
AFAIK wird auch nur Speicher reserviert und später die Objektinstanzen mittels placement new in den vorhanden Speicher erstellt.
-
ok. das mit vorhandenen aber noch nicht belegten Elementen hab ich verstanden. wenn ich meinen vector anlege als
vector<double> a(0);
dann habe ich die Größe Null.
wenn ich jetzt das erste Element mit einem wert belegen will
a[0]=3;
hab ich aber immer noch eine Größe von Null!
irgendwas hab ich wohl doch noch nicht ganz verstanden, sorry.
-
Das geht so nicht. Ein vector mit size() == 0 hat Platz für kein Element. Wenn Du ein Element hinzufügen willst, nimm push_back. vector<T>[index] kannst Du nur benutzen, wenn die Elemente schon existieren (also index < size()).
-
Auf a[0] darfst Du nicht zugreifen, wenn die Größe 0 ist! Der Vektor ist schließlich leer, da darfst Du nicht einfach reinschreiben.
Du musst vec.push_back( wert) machen in diesem Falle.
Edit:
zu langsam *g*
-
mit push_back hab ich das auch schon versucht.
a.push_back(5)
aber dann bekomme ich einen "Fehler in Anwendung".
"Die Anweisung in "0x0041d72f"verweist auf den Speicher... . Der Vorgang "read" konnte nicht..."
-
Dann geht da irgendwo grundsätzlich was schief. Poste mal bitte mehr Code.
-
der Code ist etwas zu lang. Aber der Fehler wird dann wohl an einer anderen Stelle liegen. weißt du woran soetwas im Allgemeinen liegen kann? Also nach was könnt ich im Code suchen?
-
Wenn bei nem einfachen push_back sowas passiert, hast Du dir irgendwo anständig den Speicher zerschossen. Du greifst z.B. über array-Grenzen hinweg auf Speicher zu oder auch außerhalb der Grenzen eines Vektors. Der hier besprochenen Problematik warst Du dir anscheinend noch nicht bewusst (nicht böse gemeint, jeder lernt irgendwann), daher wäre es ratsam wenn Du dir solche Stellen mal anschaust.
-
ok! Danke für die Hilfe! dann werd ich mal suchen gehen.