[C++] Sortowanie vectora wskaźników, przeciążanie operatorów


(Cinek Cnx) #1

Witam, problem jest następujący:

jest "vector v" zawierający wskaźniki do obiektów klasy MyClass (podanej poniżej). Klasa ta posiada pole int index.

Chciałbym najlepiej za pomocą metody "sort ( RandomAccessIterator first, RandomAccessIterator last )" (z bibl. algorithm) posortować wskaźniki w tym vectorze ALE w kolejność wyznaczonej przez wartości pola index obiektu na który wskazują.

struct MyClass{

	int index;

	char* inne;


	MyClass(int idx){

		index = idx;

	}

};


//...

vector v;

MyClass* mc1 = new MyClass(2);

MyClass* mc2 = new MyClass(1);

v.push_back(mc1);

v.push_back(mc2)


//Kolejnosc wskaznikow w wektorze to {mc1, mc2}

sort(v.begin(), v.end());

//Teraz chciałbym dostać {mc2, mc1} bo mc1->index > mc2->index

Przeciążenie operatorów porównań dla klasy MyClass nic nie daje, trzeba by raczej przeciążyć operatory porównań dla wskaźników MyClass*. Czy jest to możliwe? Proszę o pomoc.


(Sawyer47) #2

Nie można przeciążyć operatorów dla wskaźników jakiegoś typu. O ile dobrze pamiętam to kontenery STL ogólnie nie nadają się do przechowywania wskaźników – pewnym rozwiązaniem jest boost::shared_ptr lub boost:ptr_vector, zobacz: http://www.boost.org/doc/libs/1_45_0/li ... rence.html Jednak czy ptr_vector rozwiąże sprawę – nie mam pojęcia.


([alex]) #3

bool cmpu(MyClass* i,MyClass* j) { return (i->indexindex); }

bool cmpd(MyClass* i,MyClass* j) { return (i->index>j->index); }

// w powyższych funkcjach warto sprawdzić ewentualność i=0 lub j=0;

// np po v.push_back(0);

// i / j - mogą być nulami:

bool cmpuz(MyClass* i,MyClass* j) { return i?(j?(i->indexindex):false):(bool)j; }

bool cmpdz(MyClass* i,MyClass* j) { return j?(i?(i->index>j->index):false):(bool)i; }

sort(v.begin(),v.end(),cmpu); // malająco

sort(v.begin(),v.end(),cmpd); // wzrastająco


(Cinek Cnx) #4

Dziękuję za pomoc. Problem został rozwiązany poprzez dopisanie funkcji komparującej - tak jak napisał alex. Pozdrawiam