Rename: Vector->erase ?!?!
-
Nexus schrieb:
Jerrey schrieb:
Ich denke ich deklariere die Vektoren einfach global.....
Stimmt, durch globale Deklaration kann man immer sämtliche Fehler beheben. :p
Stimmt, vor allem die wegen unkontrollierten Zugriff (Ich durfte mal ein Programmmodul mit globalen Variablen und Klassen mit öffentlichen statischen Membern ausbaden...).
cu André
-
Sorry wegen dem Doppelpost...
-
Mmh, ja ich muss einfach nur Zahlen sortieren, die ich aus ner Datei heraus gelesen habe.
int number; ifstream file("d:/ZufallsZahlen.txt"); while(file >> number) { data.push_back(number); }Was ich dann damit machen soll?
Naja, ich soll erstmal in kleine Teile zerlegen, die alle weniger als d einträge haben.
Das hab ich mit einfacher Bruchrechnung gemacht und den Data Vector zerlegt in kleine Vektoren, indem ich in einen zweiten Vector die Anfangselemente der Teilmengen geschrieben habe.
Bsp: "0, 12, 22, 33, ..."Dann wie verlangt InsertionSort benutzt um diese kleinen Teile zu sortieren. (0...11) (12...21) ...
Und dann immer 2 dieser Mengen gemerged: wenn man also die mengen betrachtet:
"merge Menge 1 und 2" = "merge menge (0 ... 12-1)(12...22-1)" (0, 12, 22 aus cluster)
"Lösche den Eintrag in der Mitte aus Cluster" (12)
"gehe eins weiter" 0 -> 22
Und mache das gleiche wieder...Und dann danach das ganze so lange bis cluster nur noch einen Eintrag hat.
Fertig.Das is dann ein einfacher k-way merge.
Also da die Vektoren ja den Vorteil haben das man sie stets erweitern oder Elemente löschen kann, war es eigentlich vernünftig die Vektoren erstmal leer und global zu deklarieren...
Wie gesagt. Wenn jemand das immernoch viel zu umständlich ansieht, kann er mir sagen wie es noch einfacher geht. Es geht ja nicht um ein Library sondern nur um die Lösung dieser sinnlosen Aufgabe.

-
error: cannot converst 'std::vector<int, std::allocator<int> >' to 'std::vector<int, std::allocator<int> >*' for argument '1' to 'void(...)'
Nun will er den Vektor nicht als Zeiger an die Funktion übergeben... Ich habe nach ähnlichen Fehlermeldungen gesucht, aber nicht gefunden.
void func(vector<int> *test) { ...test.push_back(integer);... } main () { vector<int> test; ... func(test); }
-
Jerrey schrieb:
Nun will er den Vektor nicht als Zeiger an die Funktion übergeben...
Du musst ihn auch anweisen, dass er den Zeiger übergeben soll. Eine Implizite Konvertierung gibt es da nicht. Du musst die Adresse des Objektes holen und übergeben. Ich denke am besten liest du gleich mal diesen Artikel durch:
http://www.cplusplus.com/doc/tutorial/pointers.htmlOder am besten machst du gleich ein Tutorial oder liest ein Buch. Das ist absolutes Basiswissen.
Zudem, wieso übrgibst du nicht eine Referenz auf den Vektor?
Grüssli
-
void func ( vector<int> a) {...} main(){ vector<int> data ; func(&data); }Also, das hier gibt die Adressen der Einträge von data an 'a' weiter und speichert sie in einem neuen Vektor.
void func ( vector<int> *a) {...} main(){ vector<int> data ; func(&data); }Richtig?
-
Nein.
void func ( vector<int> a) {...} main(){ vector<int> data ; func(&data); }Parameter a ist ein vector<int> (keine Referenz, kein Pointer). Hier würde eine Kopie erzeugt werden. Der Aufruf von funct passt da aber nicht, da du dort einen Pointer auf vector<int> übergeben willst.
void func ( vector<int> *a) {...} main(){ vector<int> data ; func(&data); }Hier ist a ein Pointer auf vector<int>. Der Aufruf in der main ist auch korrekt. Wenn du in der Funktion auf deine Elemente zugreifen willst, mußt du dort aber erst dereferenzieren oder über operator[] oder über at() zugreifen.
alsovoid func ( vector<int> *a) { int e1 = a->at(0); // Zugriff auf das erste Element int e2 = (*a)[0]; int e3 = a->operator[](0); }
-
mit referenzen:
void func(vector<int>& a) { } main() { vector<int> data; func(data); }mit zeiger:
void func(vector<int>* a) { } main() { vector<int> data; func(&data); }
-
Okay, es funktioniert wirklich.
VIEEELEN VIEEELEN DANK....
Es ist schön das dann doch irgendwann alles funktioniert. Jetzt darf ich wieder langsam dahin arbeiten wo ich war : Von meinen 200 Zeilen code sind nämlich nur noch knapp 40 übrig

Aber ja vielen Dank nochmal.

An Alle . Auch für den Link zu dem Tut.
-
Also, im Kontext von oben beschriebenem Programm.
void func(vector<int> *cluster) {... cluster->erase(*cluster->at(k+1));... // Hierum geht es } main() { vector<int> cluster; func(&cluster)...}Also obige Zeile sollte mir eigentlich das Element k+1 in Cluster löschen.
Er sagt mir aber "invalid type of argument 'unary *'"
Wenn ich den Dekrementierungsoperator * vor dem cluster weglasse,
sagt er mir: no matching function to call erase(&int)...Verstehe nicht was ich falsch mache.
Danke mal wieder für die Hilfe.
Jerrey
-
at gibt dir keinen Iterator zurück, den du zum löschen brauchst. Hier würde man sowas machen:
int k = 2; cluster->erase(cluster->begin () + k);
-
Jerrey schrieb:
*Lacht*
Ich denke ich deklariere die Vektoren einfach global.....
*Lacht auch*
Ich denke, Du solltest besser mal ein gutes Buch über objektorientiertes Programmieren lesen.....
-
Schon gut... @ *lacht*
Aber was habt ihr denn gegen Freunde???
Wäre es nicht am einfachsten die Funktion in der ich Cluster definiert habe als Freund einzubaun?
-
Jerrey schrieb:
Schon gut... @ *lacht*
Aber was habt ihr denn gegen Freunde???
Wäre es nicht am einfachsten die Funktion in der ich Cluster definiert habe als Freund einzubaun?Wo bist du den nun? - Dein letztes Problem habe ich ja gelöst..
-
[quote="drakon"]
Wo bist du den nun? /quote]
Noch so ein Fehler den ich nicht mehr sehen kann. Es heißt "denn" und nicht "den".@Jerrey: Dir fehlt es hinten und vorne an Grundlagen (du deferenzierst schon wieder falsch). Bevor du irgendwelche Algorithmen implementieren willst, solltest du erstmal die Grundlagen (!) der Sprache beherrschen.

-
henker schrieb:
[quote="drakon"]
Wo bist du den nun? /quote]
Noch so ein Fehler den ich nicht mehr sehen kann. Es heißt "denn" und nicht "den".Herrlich

Ansonsten hat der Henker aber schon nicht Unrecht. Mit Zeigern, Referenzen und Iteratoren muß man einfach umgehen können, wenn man nicht ganz triviale Sachen sinnvoll in C++ umsetzen möchte.
-
henker schrieb:
@Jerrey: Dir fehlt es hinten und vorne an Grundlagen (du deferenzierst schon wieder falsch). Bevor du irgendwelche Algorithmen implementieren willst, solltest du erstmal die Grundlagen (!) der Sprache beherrschen.

Bevor du anfängst bei anderen Tippfehler zu bemängeln, solltest du selber einmal bei dir schauen. Ich weiss persönlich nicht, was "deferenzierst" sein soll...
Solche Fehler sind imo bei weitem gefährlicher, da du da einem Anfänger falsche Ausdrücke beibringst.
-
Du hast als Baby bestimmt auch mal versucht, das Quadrat durch das Dreieck zu drücken!
-
Schon wieder falsch?
Ja wir müssen das halt implementieren. Sooorryy. Aber ich will es auch lernen. ich könnte mir es wirklich einfacher machen. Sprich: globale variablen :^^
-
Zu globalen Variablen haben wir uns glaube ich genügend deutlich ausgedrückt.

Aber worin besteht nun dein aktuelles Problem?