Sortowanie wektora

0

Cześć.

Treść tematy zdaje się być banalna, jednak chodzi o to, że mam wektor w takiej postaci:

class CKlasa
{
   public:
     string imie;
     string nazwisko;
     int ilosc;
/* ... */
};

vector<CKlasa *>tablica;

I muszę posortować moją tablicę, według imienia, nazwiska lub ilości. I tu pojawia się problem, myślałem, że szybko rozwiążę to funkcja sort() z STL'a ale nie idzie - bo nie mam możliwości określenia według czego chce sortować.
No wiec chyba pozostanie mi pisanie własnej funkcji, wszystko ok zabrałem się za kodzenie (na razie sortowanie bąbelkowe, aczkolwiek odpowiadałoby mi bardziej QuickSort), ale niestety nie idzie :( wychodzi mi nie tak jak chce.

Przykład:
Jan Kowalski 15
Anna Nowak 20
Bogusław Iksiński 10

i sortując według imienia otrzymam:
Anna Kowalski 15
Bogusław Nowak 20
Jan Iksiński 10

jak widać, nie wiem jak pozamieniać pozostałe pola klasy, bo nie mogę zamieniać ich tak samo jak pola według którego sortuję bo wtedy posortuje mi się wszystko i będzie
Anna Kowalski 10
Bogusław Iksiński 15
Jak Nowak 20

Dodam, że pól klasy jest wiele więcej niż 3 przedstawione w przykładzie.

Z góry dzięki za pomoc.

0

I tu pojawia się problem, myślałem, że szybko rozwiążę to funkcja sort() z STL'a ale nie idzie - bo nie mam możliwości określenia według czego chce sortować.

Bzdura, może byś tak łaskawie zaczął od przeczytania dokumentacji zamiast rzucenia się z płaczem na forum?
http://www.cplusplus.com/reference/algorithm/sort.html
Napisz własny komparator...

0

Jakiś czas temu skończyłem robotę i nieco mi się nudziło to naklepałem przy piwie.

#include <string>
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>

using namespace std;

template < typename T1, typename T2 > 
struct komparator{
  T1 T2::*mem_ptr;
  komparator(T1 T2::*_mem_ptr) : mem_ptr(_mem_ptr) {}
  bool operator()(const T2& x, const T2& y) const {
    return x.*mem_ptr < y.*mem_ptr;
  }
};
struct zuo {
  int     a, b;
  string  opis;
  zuo(int x = 0, int y = 0, const string& z = "") : a(x), b(y), opis(z) {}
  friend ostream& operator<<(ostream& stream, const zuo&);
};
ostream& operator<<(ostream& stream, const zuo& zue) {
  return stream << "#<zuo "
		<< "- a = "    << zue.a 
		<< ", b = "    << zue.b 
		<< ", opis: '" << zue.opis
		<< "'>";
}
template<typename T1, typename T2> 
void posortowane(const string &s, vector<T2> &v, const komparator<T1, T2> &c) {
  cout << s << endl;
  sort(v.begin(), v.end(), c);
  copy(v.begin(), v.end(), ostream_iterator<T2>(cout, "\n"));
}

int main() {
  vector<zuo> zuezuo;

  zuezuo.push_back(zuo(4096, 7, "zue"));
  zuezuo.push_back(zuo(321, 89, "zuo"));
  zuezuo.push_back(zuo(69, 666, "zoo"));

  posortowane("posortowane wedle a:", zuezuo, komparator<int, zuo>(&zuo::a));
  posortowane("posortowane wedle b:", zuezuo, komparator<int, zuo>(&zuo::b));
  posortowane("...i wedle opisu:", zuezuo, komparator<string, zuo>(&zuo::opis));
}

Tego kodu i tak bezpośrednio nie wykorzystasz, w każdym razie dowód jest... Tak na oko to to niby działa, ale nie ręczę za siebie, odrobinkę coś rozmarzony jestem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1