@MarekR22:
Zgadzam się z Tobą całkowicie - używam tych szablonów głównie z przyzwyczajenia :)
Jezeli chcesz zdefiniować operator porównania na poziomie klasy lepszym rozwiązaniem jest użycie boost::indirect_iterator. Pozwala on uzyskać iterator zwracający referencję mimo iż kolekcja przechowuje wskaźniki na obiekty.
W ponizszym przykladzie posortowanie wedlug pola name wymaga:
- zdefiniowania w klasie operatora< (mozemy rowniez zdefiniowac go zewnetrznie)
- typedefa dla boost::indirect_iteratorFooVector::iterator dla wygody
- wywolania std::sort z adaptorami zamiast iteratorow kolekcji - std::sort(Adaptor(vec.begin()), Adaptor(vec.end()))
Przykład:
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <boost/iterator/indirect_iterator.hpp>
class Foo
{
public:
Foo(const std::string name): _name(name) { }
const std::string& getName() const { return _name; }
bool operator<(const Foo& other) const { return _name < other._name; }
private:
std::string _name;
};
typedef std::vector<Foo*> FooVector;
typedef boost::indirect_iterator<FooVector::iterator> Adaptor;
int main()
{
FooVector vec;
vec.push_back(new Foo("bqq"));
vec.push_back(new Foo("aqq"));
vec.push_back(new Foo("cqq"));
std::sort(Adaptor(vec.begin()), Adaptor(vec.end()));
std::transform(vec.begin(), vec.end(), std::ostream_iterator<std::string>(std::cout, " "), mem_fun(&Foo::getName));
std::cout << std::endl;
};