PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vector sortiern?



Marco812
02-07-2008, 12:48
Hallo,

beim Versuch einen Vector zu sortieren:

void MyClass::sort(vector< map<string,float> > myVector)
{
for(int i = myVector.size()-1; i>=1; i--)
{
for(int j=0; j<i; j++)
{
if(myVector[j]["value"]<myVector[j+1]["value"])
{
myVector.swap(myVector[j+1],myVector[j]);
}
}
}
}

erhalte ich den Fehler:

error: no matching function for call to `std::vector<std::map<std::string, float, std::less<std::string>, std::allocator<std::pair<const std::string, float> > >, std::allocator<std::map<std::string, float, std::less<std::string>, std::allocator<std::pair<const std::string, float> > > > >::s ...

Was mache ich Falsch und wie kann ich den Vector sortieren?

anda_skoa
02-07-2008, 14:23
Um eine leichter verständliche Fehlermeldung zu bekommen, würde ich den Vergleich in etwa so auftrennen:


float value1 = myVector[j]["value"];
float value2 = myVector[j+1]["value"];
if (value1 < value2)


Bzw, sieht dir mal std::sort() an, da kann man für eigene Datentypen auch eigene Vergleichsoperatoren verwenden.

Ciao,
_

Marco812
03-07-2008, 00:00
Oh sorry meine schuld, das hatte ich nicht gesagt. Der Fehler entsteht genau hier:


myVector.swap(myVector[j+1],myVector[j]);

wie würde denn so ein Vergleichsoperator für std::sort() aussehen?

anda_skoa
03-07-2008, 14:53
swap() tauscht den Inhalt des Objektes mit dem Parameter des Aufrufs, d.h. es ist eine Methode mit nur einem Parameter.

Du könntest das hier versuchen


myVector[j+1].swap(myVector[j]);


Ein Vergleichsfunktor ist im wesentlichen eine Klasse mit einem operator() der zwei Parameter hat


class MyCmparator
{
public:
bool operator()(MyType& a, MyType& b)
{
if (/*kriterium*/)
return true;

return false;
}
};


Ciao,
_

Marco812
10-07-2008, 16:38
Sehr gut so funktioniert es, vielen Dank!