vector & iterator
-
Hi,
wie kann ich aus einem vector ein beliebiges Element löschen? Ich verstehe die Iteratoren nicht so ganz :(:
mein_vector besteht aus Pointern einer anderen Klasse.
for(unsigned int i=0; i < mein_vector.size(); i++) { if (irgendeine Bedingung) { mein_vector.erase( ??? )); delete mein_vector[i]; break; } }Wie muss ich jetzt den Iterator (wo ??? steht) erzeugen, damit er auf die Position i zeigt? Oder reicht das delete aus um das Element zu löschen?
Und eine 2. Frage hätte ich noch:
Gibt es in C++ einen ganzzahligen Datentyp der größer ist als "unsigned long"? Konkret geht es mir darum eine 12stellige ganze Zahl darzustellen?
mfg,
soad
-
mein_vector.begin()+i
EDIT: öhm, delete ist nur für mit new angelegte Sachen, dessen bist du dir bewusst, ja? Alles andere wird automatisch ordentlich aufgeräumt, ohne erase und ohne delete.
-
vector<myType*> my_vector(10); //dein vektor mit zeigern auf die objekte vector<myType*>::iterator i; //der passende iterator myType* pMyObject=new myType(); //dein objekt auf heap erzeugen my_vector.push_back(pMyObject); //zeiger in den vektor schreiben //alle objekte in einer schleife löschen: for(i=my_vector.begin(); i!=my_vector.end(); i++){ delete *i; // *i liefert zeiger, delete entfernt das objekt } my_vector.clear(); //löscht alle zeigerzu unsigned long: nein, das größte was es bei normalen PC's gibt ist 2^32 , wenn du es genauer haben willst, brauchst du einen superrechner.
-
super, danke Shinja & Andrey !!
-
Andrey schrieb:
zu unsigned long: nein, das größte was es bei normalen PC's gibt ist 2^32 , wenn du es genauer haben willst, brauchst du einen superrechner.
Ach Quatsch.

Jeder "normale" (32-Bit-Architektur) Rechner hat auch Unterstützung für größere Ganzzahl-Datentypen. Die sind lediglich in C++ nicht standardisiert.
-
okay... ich muss wie immer zugeben, dass ich kein spezialist auf diesem gebiet bin. Aber wenn ich mir so die assembler befehle für meinen rechner anschaue, dann sieht es für mich danach aus, als ob da nur begrenzt viel platz in den registern vorhanden ist, die direkt an der ALU hängen... und imho können da viel größere zahlen auch nicht reinpassen... oder?

-
@ Andrey: hängt doch nich von den registergroessen ab.
@ soad: bei den meisten compilern gibts unsingned long long (8 bytes), und für beliebig grosse zahlen schau dir mal std::bitset oder std::vector<bool> an (weiss nichmehr was da besser geeignet is).
-
Hi !
Andrey schrieb:
... und imho können da viel größere zahlen auch nicht reinpassen... oder?

Genau, größere Zahlen passen da nicht rein. In das Register eines 32 Bit Rechners kann man maximal die Ganzzahl 4294967295 reinpacken.
Man kann aber eine Zahl auf mehrere Register verteilen und so mit größeren Zahlen rechnen.Andrey schrieb:
Gibt es in C++ einen ganzzahligen Datentyp der größer ist als "unsigned long"? Konkret geht es mir darum eine 12stellige ganze Zahl darzustellen?
In C++ weiss ich nicht, aber der erweiterte ANSI C-Standard (ANSI C99), hat
einen schnuckeligen Datentypen unsigned long long mit 8 byte, mit dem kannst du
eine Zahl von 0 bis 18446744073709551615 darstellen ( satt mehr als 12 Stellen, die du brauchst ).Wenns nicht unbedingt ganzzahlig sein muss, könntest du ja auch float oder double nehmen.
Gruß,
p.
-
na gut, schon klar, wenn man es sehr genau braucht, dann kann man die zahl auf einem megabyte im RAM verteilen, und dann stück für stück damit rechnen... Aber der rechner macht es dann nicht mehr "in einem rutsch", da braucht man schon n paar mnemonics mehr, als einfach nur "add"...
-
danke, bezgl unsigned long long! ist das quasi auch ein standard datentyp der überall vorhanden ist, also sowohl windows als auch unix?
und __int64 ist das ein spezieller 64bit datentyp oder ist das windows spezifisch?