zweiten Ordnungsoperator auf eigener Klasse nutzen

mxm

Grünschnabel
Hallo zusammen,

ich habe eine Klasse auf der ich den "<"-Operator definiert habe mit dessen Hilfe ich eine Ordnung spezifiziere, so dass ich einfach per:

set<Klassename> MeineSet;

eine Set erzeugen kann,

Jetzt brauche ich aber noch eine zweite Set in der ich die Objekte nach einer anderen Ordnung sortiere, kann mir jemand helfen und sagen wie ich die zweite Set definiere, so dass Sie nicht mit dem < Operator sortiert, sondern einem anderen benutzt.

Dank im voraus
mxm
 
Hallo,

eigtl. gibt es doch nur 2 Ordnungen oder? Also aufsteigend und absteigend, wobei erstere durch operator< und zweitere durch operator> implementiert werden könnte.

D.h. willst du das operator< für deinen Typ aufgerufen wird schreibst du std::set<Foo, lesser<Foo> >, wobei der lesser Comparator auch nich angegeben werden muss (da lesser default ist), oder wenn du willst das operator> für deinen Typ aufgerufen wird schreibst du std::set<Foo, greater<Foo> >.

Wenn du dennoch einen eigenen Comparator definieren willst schau mal da:

C++:
#include <iostream>
#include <iterator>
#include <set>

class Foo {
private:
    int elem;

public:
    Foo(int elem) : elem(elem) {}

    bool operator<(const Foo& toCompare) const {
        return toCompare.elem > elem;
    }

    bool operator>(const Foo& toCompare) const {
        return toCompare.elem < elem;
    }

    friend std::ostream& operator<<(std::ostream &cout, const Foo& toPrint) {
        cout << toPrint.elem;
        return cout;
    }

    int getElem() const {
        return elem;
    }
};

struct FooComparator {
    bool operator()(const Foo& toCompare1, const Foo& toCompare2) {
        return toCompare1.getElem() > toCompare2.getElem();
    }
};

int main(){
    Foo a[] = { Foo(1), Foo(10), Foo(3), Foo(14), Foo(-10)};

    //operator< of Foo will be called
    std::set<Foo> ofs1(a, a + 5);

    //operator> of Foo will be called
//  set<OrderedFoo, greater<Foo> > ofs2(a, a + 5);

    //operator() of FooComparator will be called
    std::set<Foo, FooComparator> ofs2(a, a + 5);

    //output content of ofs
    copy(ofs1.begin(), ofs1.end(), std::ostream_iterator<Foo>(std::cout, "\n"));
    std::cout << "---" << std::endl;
    copy(ofs2.begin(), ofs2.end(), std::ostream_iterator<Foo>(std::cout, "\n"));
}

Siehe auch:
http://www.sgi.com/tech/stl/set.html

Gruß,
RedWing
 
Zurück