Frage zu Speichernutzung

CodeFatal

Erfahrenes Mitglied
Moin moin,

ich nutz zwar öfter new/delete bzw in C malloc/realloc/free und war eigentlich ganz glücklich damit.

Keinen Plan warum aber mir mangelte es an nichts irgendwie passte das immer.
Jetzt bräuchte ich aber ein realloc unter c++. MSDN schweigt dazu und Google und das Forum hier eröffnen einem die tolle Nachricht das es ein realloc nicht gibt :-(
Ich könnt mir die Funktion natürlich jetzt selbst schreiben, aber man muss ja mal über den eigenen Teller hinausschauen;-)
Da in den von mir gefundenen Seiten der/die/das Macro/Funktion/Klasse "Vektor" mehrfach genannt wurde hätt ich da mal nen paar Fragen zu:
1) Was ist das genau?
2) Wie kann man das einsetzen?
3) welche Vor/Nachteile ?
4) was ist bei Verwendung zubeachten?


Danke schonmal für eure Antworten

Gruss Michael
 
Vector gehört zu der STL Bibliothek hinzu und kann in dein Projekt durch den Präprozessorbefehl
Code:
#include <vector>
eingefügt werden. Vector selbst ist eine Containerklasse für Datentypen, die eine unbestimmte Anzahl an Element aufnehmen kann. Den Vektor kannst du im Endeffekt fast immer gebrauchen, wenn du irgendwelche Daten unbestimmter Anzahl erfassen und verarbeiten musst.

Hier ein kleines Beispiel:
Code:
  vector <int>daten;
  for(int i=0;i<20;i++)
   daten.insert(daten.end(), i);   //Daten werden am Ende eingefügt
  
  for(int i=0;i<20;i++)
   std::cout <<daten[i];
Vorteile sind eben, dass du dir nicht Gedanken machen musst, wie du den Speicher verwaltest und wie groß deine Datenmenge sein kann(theoretisch). Von den Nachteilen ist es so, dass wenn du beispielsweise ein Vektor hast und einen iterator der dein Container durchläuft, dass sobald wenn eine Modifikation des Vektors vorliegt, dein iterator ungültig wird. Frage mich nicht warum. Es ist ein Urrtum was ich selbst nicht verstehe.

Code:
   vector <int>daten;
  vector <int>:: iterator iter
   for(int i=0;i<20;i++)
    daten.insert(daten.end(), i);   //Daten werden am Ende eingefügt
   
  iter = daten.begin();
  
   for(iter;iter != daten.end();iter++)
    std::cout <<*iter;
   
  iter = daten.begin();
  
  daten.insert(daten.begin(),2);
  
  std::cout << *iter; //Fehler

Mit freundlichen Grüßen
 
Danke für die ausführliche Erklärung.

Hört sich ja einfacher an als ich befürchtet hab;-)

zwei Fragen hab ich aber noch:
1) was ist mit "<int> " genau gemeint? Anhand des Beispiels geh ich einfach mal davon aus, das dadurch die Grösse eines Elements festgelegt wird - ähnlich "sizeof(int)",
Aber das Ding wird doch sicher nen Namen haben. Falls noch was wesentlich anderes als bei dem "sizeof" Operator passiert: Was genau?
2) Kann es sein, das vor der Umstellung auf .Net die "std" Klasse nicht exestierte und auch damit der Vektor Container nicht? Arbeite momentan mit VS eMbedded c++ 4.0 :-)

Gruss Michael
 
Hi.

Die Klasse std::vector ist eine Template Klasse. Templates stellen sozusagen ein Grundgerüst für eine Klasse oder Funktion zur Verfügung.

Code:
template<class T> Foo {
public:
  int compute (T param);
};
Diese Template Klasse besitzt einen Template-Parameter den man dann in den <> Zeichen beim Deklarieren übergeben muß.

Templates müssen instanziert werden - d.h. die Platzhalter bzw. Template Parameter müssen durch existierende Typen ersetzt werden. Das geschieht bei der Deklaration einer konkreten Instanz der Template Klasse:
Code:
Foo<double> fd;
Dabei generiert der Compiler den Code
Code:
class Foo {
public:
  int compute(double param);
};
Allerdings sind Instanzen von Template Klassen nicht vom gleichem Typ - d.h. Foo<int> und Foo<double> sind 2 völlig verschiedene Typen.

Zu deiner 2ten Frage: Das hat nichts mit .Net zu tun. Den std Namensraum gibt es schon eine ganze Weile. C++ ist eine standardisierte Sprache (ANSI/ISO 14882:1999) in dem auch der Namensraum std festgelegt wird. Am besten besorgst du dir mal ein gutes Buch über C++ und die C++ STL.

Gruß
 
Zurück