Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Objekte im Vector tauschen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
12.09.2004, 01:18 Uhr
(un)wissender
Niveauwart


Das Problem ist hier, dass compareInterpret keine alleinstehende Funktion ist, sondern zu einer Klasse gehört.


C++:

#include <functional>

bool Medium::compareInterpret(Medium& a, Medium& b)
{
    return a.getInterpret() < b.getInterpret();
}


void Medium::sortInterpret()
{
    sort(mainVec.begin(), mainVec.end(), std::mem_fun(&Medium::compareInterpret));
}


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 12.09.2004 um 01:20 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
12.09.2004, 01:26 Uhr
(un)wissender
Niveauwart


Normalerweise ist es sicherer (const) und performanter (wegen inline), es so zu machen


C++:
#include <functional> //Für std::binary_function

//Ev. als innere Klasse von Medium -> Kapselung
struct CompareInterpret : public std::binary_function<Medium, Medium, bool>
{
  bool operator()(const Medium& a, const Medium& b) const
  {
    return a.getInterpret() < b.getInterpret(); //getInterpret() muss const sein!
  }
};

//So wird es aufgerufen
void Medium::sortInterpret()
{
    sort(mainVec.begin(), mainVec.end(), CompareInterpret());
}




Ist alles so ins Forum getippt, entschuldige bitte Tippfehler.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 12.09.2004 um 01:27 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
12.09.2004, 02:10 Uhr
~Dani
Gast


Danke (un)wissender!

Ich habe beide Varianten mal ausprobiert... Aber beide wollen einfach nciht laufen ...

Die zweite wirft so eine lange Fehlermeldung, dass der Anfang nicht mehr sichtbar ist (doofe console bei WIN98). Die erste wirft folgenden Fehler: "no matching function for call to 'mem_fun(bool (Medium::*)(Medium&, Medium&)'"
Weißt du damit in dem Zusammenhang was anzufangen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
12.09.2004, 08:44 Uhr
(un)wissender
Niveauwart


Du meinst sicher die erste?
Ah, ja sicher, entschuldigung, die hat ja Parameter (Medium::compareInterpret(Medium &,Medium &), da geht mem_fun nicht, müßtest du dann selber schreiben.

Nimm halt die zweite, die funzt auf jeden Fall und ist eh besser!
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
12.09.2004, 09:00 Uhr
(un)wissender
Niveauwart


Hier mal ein längeres funktionierendes Beispiel von Medium-Objekte, nicht Pointer.


C++:
#include <functional>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <vector>
#include <string>

class Medium
{
public:
    Medium(const std::string& interpret)
    : interpret_(interpret) {}
    
    const std::string getInterpret() const //const ist wichtig!
    { return interpret_; }
    
    friend std::ostream & operator<<(std::ostream & out, const Medium & medium)
    { return out << medium.interpret_; }
    
    //Als innere Klasse von Medium -> Kapselung
    struct CompareInterpret : public std::binary_function<Medium, Medium, bool>
    {
        bool operator()(const Medium& a, const Medium& b) const
        {
            return a.getInterpret() < b.getInterpret(); //getInterpret() muss const sein!
        }
    };

private:
    std::string interpret_;
};    



//So wird es aufgerufen
int main()
{
    std::vector<Medium> mainVec;
    mainVec.push_back(Medium("b"));
    mainVec.push_back(Medium("a"));
    mainVec.push_back(Medium("c"));
    
    std::cout << "Vor dem Sortieren: ";
    std::copy(mainVec.begin(), mainVec.end(), std::ostream_iterator<Medium>(std::cout, " "));
    std::cout << std::endl;
    
    std::sort(mainVec.begin(), mainVec.end(), Medium::CompareInterpret());
    
    std::cout << "Nach dem Sortieren: ";
    std::copy(mainVec.begin(), mainVec.end(), std::ostream_iterator<Medium>(std::cout, " "));
    std::cout << std::endl;
    return 0;
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
12.09.2004, 09:09 Uhr
(un)wissender
Niveauwart


Hier noch einmal die Pointerversion, die für dich ev. eher in Frage kommt.


C++:
#include <functional>
#include <algorithm>
#include <iterator>
#include <iostream>
#include <vector>
#include <string>

class Medium
{
public:
    Medium(const std::string& interpret)
    : interpret_(interpret) {}
    
    const std::string getInterpret() const //const ist wichtig!
    { return interpret_; }
    
    friend std::ostream & operator<<(std::ostream & out, const Medium * medium)
    { return out << medium->interpret_; }
      
    //Als innere Klasse von Medium -> Kapselung
    struct CompareInterpret : public std::binary_function<Medium *, Medium *, bool>
    {
        bool operator()(const Medium* a, const Medium* b) const
        {
            return a->getInterpret() < b->getInterpret(); //getInterpret() muss const sein!
        }
    };

private:
    std::string interpret_;
};    

//So wird es aufgerufen
int main()
{
    std::vector<Medium *> mainVec;
    mainVec.push_back(new Medium("b"));
    mainVec.push_back(new Medium("a"));
    mainVec.push_back(new Medium("c"));
    
    std::cout << "Vor dem Sortieren: ";
    std::copy(mainVec.begin(), mainVec.end(), std::ostream_iterator<Medium *>(std::cout, " "));
    std::cout << std::endl;
    
    std::sort(mainVec.begin(), mainVec.end(), Medium::CompareInterpret());
    
    std::cout << "Nach dem Sortieren: ";
    std::copy(mainVec.begin(), mainVec.end(), std::ostream_iterator<Medium *>(std::cout, " "));
    std::cout << std::endl;
    
    for(std::vector<Medium *>::iterator i = mainVec.begin(); i != mainVec.end(); ++i)
    {
        delete *i;
    }
    
    return 0;
}



Damit solltest du eigentlich alles haben, um dein Sortierproblem lösen zu können.


Bearbeitung:

Das mit der lange Fehlermeldung hat vermutlich (kenne deinen Code nicht) den Grund, dass du die const-Korrektheit verletzt hast.
In einer als const deklarierten Funktion können nur andere auch als const deklarierte Funktionen aufgerufen werden, ich vermute mal, dass getInterpret bei dir nicht const war, es aber hätte sein sollen.
Alternativ (auch Windalfs Nemesis genannt) kannst du auch in CompareInterpret::operator() alle const weglassen, aber das wäre sehr schlechter Stil.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 12.09.2004 um 09:17 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
12.09.2004, 10:19 Uhr
(un)wissender
Niveauwart


Wenn dir das alles zu viel ist:


C++:
bool compareInterpret(Medium& a, Medium& b)  //Medium:: entfernt
{
    return a.getInterpret() < b.getInterpret();
}


void Medium::sortInterpret()
{
    sort(mainVec.begin(), mainVec.end(), compareInterpret);
}



--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
12.09.2004, 16:42 Uhr
~Dani
Gast


Ich weiß gar nicht, wie ich das je wieder gutmachen könnte... WOW..

Habe jetzt also das Pointer beispiel in den Code eingebaut. Nur ohne den friend-ostream-iterator-Kram, weil ich den für die Ausgabe nicht brauche...
getInterpret ist auch const
Das Compilieren klappt ohne Probleme... AAAAAAAAber wenn ich jetzt sort(...) aufrufe, hält das Programm an...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
12.09.2004, 17:29 Uhr
~Dani
Gast


Ich hab jetzt resigniert und einfach unsere bubble-sort methode genutzt und std::swap()...

ist natürlich vieeeeeeeeeeeeeel langsamer als std::sort, aber es geht wenigstens :/
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
12.09.2004, 21:12 Uhr
(un)wissender
Niveauwart


Um zu sagen, warum std::sort nicht klappt, bräuchten wir mehr Code. Der semantische Fehler (std::sort an sich sollte fehlerfrei sein) liegt vermutlich in diesem.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: