PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : vector in C++


DocEW
2004-04-21, 19:25:58
Hi!

Ich stehe (mal wieder) mit den C++-Biblitheken auf dem Kriegsfuß und habe ein echt simples Problem, bei dem mir sicher jemand helfen kann. Am besten wäre es, wenn ich eine "Übersetzung" für dieses Java-Fragment hätte, dann müßten eigentlich alle Fragen geklärt sein:

import java.util.Vector;

Vector v = new Vector();
v.add( new String("Hallo,") );
v.add( new String(" test...") );

Ich hätte allerding gerne einen Zeiger auf einen Vector, also quasi wie in Java.

Danke!

DocEW

DocEW
2004-04-21, 19:34:00
Ich glaube es ist doch besser, wenn ich konkreten Code poste... Also: Was ist hierdran falsch?

std::vector<Facility*> *facilities = new std::vector<Facility*> (10);

int connectionCostsA[] = { 2, 4, 7, 4, 2, 5, 3 };
(*facilities)[0]= new Facility(0, 12, connectionCostsC );

int connectionCostsB[] = { 9, 3, 7, 7, 6, 4, 5 };
(*facilities)[1]= new Facility(1, 12, connectionCostsC );

Irgendwie klappt das nicht. Wenn ich mit dem Debugger gucke, speichert er immer nur die erste Facility ab!

zeckensack
2004-04-21, 20:11:43
Sorry, war Unsinn

HellHorse
2004-04-21, 21:15:58
Da wir gerade dabei sind:
Kann es sein, dass random_shuffle aus STL für einen gegebenen Vector immer das gleiche Resultat produziert?
Bei mir sieht es irgendwie danach aus.

@DocEW
Ein Stringliteral ist schon ein Stringobjekt (in Java), da muss man nicht noch eins draus machen.

marco42
2004-04-21, 21:50:23
Original geschrieben von DocEW
Ich glaube es ist doch besser, wenn ich konkreten Code poste... Also: Was ist hierdran falsch?

std::vector<Facility*> *facilities = new std::vector<Facility*> (10);

int connectionCostsA[] = { 2, 4, 7, 4, 2, 5, 3 };
(*facilities)[0]= new Facility(0, 12, connectionCostsC );

int connectionCostsB[] = { 9, 3, 7, 7, 6, 4, 5 };
(*facilities)[1]= new Facility(1, 12, connectionCostsC );

Irgendwie klappt das nicht. Wenn ich mit dem Debugger gucke, speichert er immer nur die erste Facility ab!

Kennst du push_back?

facilities->push_back(new Facility(1, 12, connectionCostsC));

Tom Servo
2004-04-21, 22:52:22
Der originale C++ Code sollte eigentlich funktionieren. Zumindestens ich sehe da keinen Fehler. Vielleicht spinnt der Debugger?

Hier mal ein Testprogramme:


#include <vector>
#include <iostream>

typedef int A;
typedef std::vector<A*> C;

int main()
{
C *c = new C(10);
for (int i=0; i < 10; ++i)
(*c)[i] = new A(i);

for (int i=0; i < 10; ++i)
std::cout << "*(*c)[" << i << "] = " << *(*c)[i] << std::endl;

}


Ausgabe ist:


*(*c)[0] = 0
*(*c)[1] = 1
*(*c)[2] = 2
*(*c)[3] = 3
*(*c)[4] = 4
*(*c)[5] = 5
*(*c)[6] = 6
*(*c)[7] = 7
*(*c)[8] = 8
*(*c)[9] = 9

ethrandil
2004-04-21, 23:12:17
Original geschrieben von DocEW std::vector<Facility*> *facilities = new std::vector<Facility*> (10);

int connectionCostsA[] = { 2, 4, 7, 4, 2, 5, 3 };
(*facilities)[0]= new Facility(0, 12, connectionCostsC );

int connectionCostsB[] = { 9, 3, 7, 7, 6, 4, 5 };
(*facilities)[1]= new Facility(1, 12, connectionCostsC );
Sollten da nicht connectionCostsA und connectionCostsB stehen?

- Eth

littlejam
2004-04-22, 08:58:28
Original geschrieben von DocEW
Ich glaube es ist doch besser, wenn ich konkreten Code poste... Also: Was ist hierdran falsch?

std::vector<Facility*> *facilities = new std::vector<Facility*> (10);

int connectionCostsA[] = { 2, 4, 7, 4, 2, 5, 3 };
(*facilities)[0]= new Facility(0, 12, connectionCostsC );

int connectionCostsB[] = { 9, 3, 7, 7, 6, 4, 5 };
(*facilities)[1]= new Facility(1, 12, connectionCostsC );

Irgendwie klappt das nicht. Wenn ich mit dem Debugger gucke, speichert er immer nur die erste Facility ab!

So wie ich das sehe bestellst du Speicher für 1 Objekt und greifst dann aber auf 2 Objekte zu.
IMO müsste es
std::vector<Facility*> *facilities = new std::vector<Facility*> [10];
heißen.
Dann hast du 10 Objekte und kannst auch per Zeiger drauf zugreifen.

Gruß

zeckensack
2004-04-22, 11:48:48
Original geschrieben von littlejam
So wie ich das sehe bestellst du Speicher für 1 Objekt und greifst dann aber auf 2 Objekte zu.
IMO müsste es
std::vector<Facility*> *facilities = new std::vector<Facility*> [10];
heißen.
Dann hast du 10 Objekte und kannst auch per Zeiger drauf zugreifen.

Gruß Nö. Er legt einen vector von Zeigern auf Facilty an. Darin speichert er - äusserst passend - zwei Zeiger auf Facility-Objekte, die er dynamisch anlegt. Ist IMO alles korrekt.

10 ist die Initialgrösse des vector (diese wird je nach Bedarf automatisch wachsen). Selbstverständlich kann er also darin auch zwei Zeiger speichern. Dein Vorschlag würde zehn Vektoren anlegen.

ethrandil
2004-04-22, 12:47:13
Original geschrieben von zeckensack
Nö. Er legt einen vector von Zeigern auf Facilty an. Darin speichert er - äusserst passend - zwei Zeiger auf Facility-Objekte, die er dynamisch anlegt. Ist IMO alles korrekt.
Imho nicht, denn er speichert zwei IDENTISCHE (!) Zeiger.

Ich vermute das ist bloß ein Tippfehler....

- Eth

marco42
2004-04-22, 14:17:40
Original geschrieben von zeckensack
10 ist die Initialgrösse des vector (diese wird je nach Bedarf automatisch wachsen). Selbstverständlich kann er also darin auch zwei Zeiger speichern.

Dynamisch vergroessert es sich aber nur, wenn er push_back benutzt. Der [] operator ist unchecked, at() waere da eine sichere Variante, aber beide vergroessern den vector nicht.

Zarathustra
2004-04-22, 14:34:12
Die runden Klammern an der 10 oben sind schon richtig!

@ethrandil:
Kannst du bitte mal hervorheben, wo du den Tippfehler vermutest?

Xmas
2004-04-22, 15:21:24
Du verwendest connectionCostsC statt connectionCostsA/B.

Gast
2004-04-22, 18:04:57
Wo speichert er denn zwei identische Zeiger ?? Er fordert zweimal neuen Speicher auf'm Heap an, es wäre ein Fehler, wenn er zweimal den gleichen Zeiger geliefert bekommen sollte ohne dass er vorher den ersten wieder freigegeben hat.

DocEW
2004-04-23, 10:39:33
Original geschrieben von ethrandil
Imho nicht, denn er speichert zwei IDENTISCHE (!) Zeiger.

Ich vermute das ist bloß ein Tippfehler....

- Eth
Ja, sorry, das war nur'n Tippfehler! Ich werde die Vorschläge leider erst am Montag ausprobieren können, trotzdem schonmal vielen Dank!