Probleme mit vector und indexierung
-
Ich habe einen Graphen, der besteht aus Knoten, mit angehängten Kanten.
Die Knoten sind ein vector container mit int pointer.vector<vector<int>*>
die Konten sind
vector<int>
ich habe eine Funktion der man einen char* str übergeben, kann und die einzelnen chars in einen Vector packt.
vector<int>* MyGraph::convertCharToVector(char* str) { vector<int>* vec = new vector<int>; int size=0; while(str[size]!='\0') { ++size; } vec->resize(size); for(int i=0; i<size;i++) { vec->push_back(int(str[i])); } return vec; }
Allerdings werden nicht die chars con str[i] im vector gespeichert, sondern die Indizes, also i.
Wieso?
-
Wie kommst du darauf, dass die Indizes gespeichert werden? Deinem Code entsprechend kann ich mir das nicht vorstellen. Ausserdem, warum nutzt du nicht gleich
vector<char>
wenn du eh char* str als Quelle hast?
btw:
int size=0; while(str[size]!='\0') { ++size; }
Dir ist schon klar, dass es dafür so schön veraltete
Funktionen wie strlen gibt?
-
groovemaster2002 schrieb:
vector<char>
wenn du eh char* str als Quelle hast?
[/cpp]oh kannte ich nicht danke.
ich weiss auch nicht weiso, aber er gibt sie tatsächlich aus.
-
cof schrieb:
ich weiss auch nicht weiso, aber er gibt sie tatsächlich aus
Dann zeig mal wie deine Ausgabe ausschaut.
Übrigens, wenn es dir nur darum geht Strings zu speichern, dann brauchst du dafür überhaupt keinen vector, sondern nimmst gleich string. Der kann auch native C-Strings (also char[] oder const char[]) als Quelle verarbeiten.
-
also vector<char> kenn ich natürlich schon wenn du einen Vector mit chars meints.
Ich speichere eingentlich keine strings, sondern ints.
Da ich zu faul war für jeden Wert push_back zuschreiben, kam ich auf die erwähnte idee.
Könnte allerdings einfach einen int[] füllen und den in den vector umfüllen, anstelle der char konvertierung.Ausgabe:
0 1 2 3 4 5 6 7 8 9 10 11 12
-
cof schrieb:
Könnte allerdings einfach einen int[] füllen und den in den vector umfüllen, anstelle der char konvertierung.
Nee, dann würde ich lieber bei der bisherigen Methode bleiben. Ein temporärer Puffer ist dann irgendwie doppelt-gemoppelt, wenn es dir nicht zu sehr auf Performance ankommt.
cof schrieb:
Ausgabe:
0 1 2 3 4 5 6 7 8 9 10 11 12Lustig
. Eigentlich hatte ich den Code deiner Ausgabe gemeint.
-
ach so:
oid MyGraph::show() { for(unsigned int i=0; i<m_kn.size(); i++) { cout << "Der Knoten " << i << " enthaelt: "; for(unsigned int j=0; j<m_kn[i]->size();j++) { cout << j << " "; } cout << endl; } }
und die überladene Funktion, wenn man nur einen Bestimmten Knoten ausgeben will
void MyGraph::show(int pos) { for(unsigned int i=0; i<m_kn[pos]->size();i++) { cout << "Der Knoten " << pos << " enthaelt: "; } cout << endl; }
btw. usigned muss sein, sonst schimpft der Kompiler
-
Natürlich werden Indizes ausgegeben, wenn du Indizes ausgibst.
Im vector werden schon die chars gespeichert, du solltest sie aber so ausgeben:
oid MyGraph::show() { for(vector<vector<int>*>::iterator i=m_kn.begin(); i!=m_kn.end(); ++i) { cout << "Der Knoten " << i << " enthaelt: "; for(vector<int>::iterator j=m_kn[i]->begin(); j!=m_kn[i]->end(); ++j) { cout << m_kn[i][j] << " "; } cout << endl; } }
-
jaja, das ist natürlich nicht sooo clever. danke.