Rename: Vector->erase ?!?!



  • Will eigentlich nur einen Zeiger auf einen Vector auf eine Funktion übergeben,
    damit ich den Inhalt da drin sortieren kann; und weil vector.size() beliebig groß werden kann, will ich nicht den Vektor übergeben.

    Aber

    void k_L_MergeSort( int *a, int k, int anfang, int ende, int* bound)

    gibt mir dann: cannot convert 'std::vector<ind, std::allocator<int> >' to 'int*' for argument 1 to 'void k_L_MergeSrt(int*, int, int, int, int*)

    Ein anderes Problem, falls dazu jemand gerade zufällig eine Antwort hat:
    Ich brauche öfters vector.size() in for-schleifen, etwa in der Form
    for (; vector.size() < k;)

    Da meldet er dann, error: request for member 'size' in 'cluster' which is of non-class type *int.

    Habe dann etwas unbeholfen mit static_cast versucht das zu beheben, wollte aber auch nicht .

    Danke schonmal für eure Zeit.



  • Jerrey schrieb:

    gibt mir dann: cannot convert 'std::vector<ind, std::allocator<int> >' to 'int*' for argument 1 to 'void k_L_MergeSrt(int*, int, int, int, int*)

    Was ja auch verständlich ist, da du hier nirgends einen Pointer auf einen Vector hast. Korrekt wäre std::vector<int, std::allocator<int> >* oder besser eine Referenz auf den Vektor (dann ersparst du dir die unschöne direkte Dereferenzierung).

    Jerrey schrieb:

    Da meldet er dann, error: request for member 'size' in 'cluster' which is of non-class type *int.

    Auch klar, schließlich ist deine Variable nur ein Pointer und Pointer haben keine Member.



  • Oh gut.

    Werd ne Weile brauchen bis ich das jetzt verstanden und umgesetzt habe. Mit Arrays scheint das einfacher gewesen zu sein... *grummel*

    🙂 Danke



  • Jerrey schrieb:

    Mit Arrays scheint das einfacher gewesen zu sein... *grummel*

    Wann sollte es jemals mit Arrays und Zeiger einfacher sein, als mit Objektreferenzen.

    Ich weiß natürlich auch nicht was deine Funktion "k_L_MergeSort" genau machen soll. Zumal ich die Namenswahl wenig intuitiv finde. Wofür steht k_L_?

    cu André



  • Naja, ist eine Implementierung eines K-Way MergeSort Algorithmus,
    aber hinzu kommt, dass das Merging nicht mit einem Binärbaum arbeitet,
    sondern jeweils L Branches auf gleicher Ebene gemerged werden.
    Ob das etwas an der Performance ändert werd ich dann sehn wenn das Ding läuft 🙂

    Mit Arrays und Zeigern nicht einfacher? Also bisher habe ich immer einen Array an die Funktion übergeben, bei der Funktionsdeklaration eben den Zeigeroperator benutzt und ich konnte in der Funktion mit dem Objekt umgehen, wie zuvor.

    Einfacher geht es da ja wirklich nicht. Aber in der Tat, das funktioniert gerade überhaupt nicht.

    Naja, ich meld mich nochmal wenn ich die Debugger Ausgabe von 30 auf 2 Zeilen runter hab. 🙂



  • Mmh gut, also nochmal zur Ausgangsfrage.

    Wenn also vector hier ein zeiger auf einen vektor darstellt, wie kann ich dann vector.size() ermitteln?



  • vector->size() (wobei du aufpassen solltest, ob ein Variablenname vector so klug ist).

    Ich glaube du solltest dir nochmal ein Tutorial zu Zeigern durchlesen;)



  • *Lacht*

    Ich denke ich deklariere die Vektoren einfach global.....

    Ich meine:
    - Es ist nur ein kleines Programm und ich brauche mir keine Angst deswegen zu machen was mit ihnen passiert.
    - Wieso jedesmal die Zeiger mitschleppen wenn ich einfach immer von der Funktion aus in die Vektoren schreiben kann. Es geht doch eigentlich gerade darum in den Funktionen nur das zu haben, was getan wird, und nicht das womit es getan wird
    (deswegen die doofe idee mit den Zeigern, die hier unnötig ist)

    Tut mir also Leid, dass ich mich und euch damit aufgehalten habe. 🙂



  • Wieso? Bei deinem Code gibt es dafür doch garkeinen Grund.



  • Jerrey schrieb:

    Ich denke ich deklariere die Vektoren einfach global.....

    Stimmt, durch globale Deklaration kann man immer sämtliche Fehler beheben. :p

    Trotzdem habe ich jetzt nicht ganz verstanden, worauf du hinauswillst (könnte aber auch daran liegen, dass ich leicht müde bin). 😉



  • 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);
    }
    

  • Administrator

    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.html

    Oder 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.
    also

    void 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);
    

Anmelden zum Antworten