[solved][C++]Szablonowa funkcja sortująca

0

Mam taką funkcję:

template<class typ_danych> void sortuj( int ile, typ_danych * czego )
{
	typ_danych tmp;

	for(int i=1; i < ile ;i++)
		for(int j=ile-1 ; j >= i ; j--)
			if( czego[j-1] > czego[j] )
            {
				tmp = czego[j-1];
                czego[j-1] = czego[j];
                czego[j] = tmp;
            }
}

i dla int wszystko działa, ale jak podam string to już mi pozostawia tablicę bez zmian. Co jest nie tak?? Z góry dzięki.

0

Co to znaczy string? Jeżeli masz na myśli C-stringi (czyli tablicę charów zakończoną \0) to odpowiedź jest taka, że operator > nie porównuje takich stringów poprawnie (to znaczy nie tak jakbyś chciał). Do tego służy strcmp.

Natomiast jeżeli string to std::string (tak jak powinno być) to u mnie działa ;-)

0
template<class typ_danych>
struct wiekszy
{
   bool operator()(const typ_danych &dane1, const typ_danych &dane2)
   {
      return dane1 > dane2;
   }
};

template<class typ_danych>
struct zamien
{
private:
   typ_danych daneTmp;
public:
   void operator()(typ_danych &dane1, typ_danych &dane2)
   {
      daneTmp = dane1;
      dane1 = dane2;
      dane2 = daneTmp;
   }
};

template<class typ_danych, class komparator = wiekszy<typ_danych>, class zamieniacz = zamien<typ_danych> >
class sortownik
{
public:
   static void sortuj(int ile, typ_danych * czego)
   {
      komparator kom;
      zamieniacz zam;

      for(int i=1; i < ile ;i++)
         for(int j=ile-1 ; j >= i ; j--)
            if(kom(czego[j-1], czego[j])) zam(czego[j-1], czego[j]);
   }
};

const int ile = 5;
const char * napisy[ile] = { "ccc", "aaa", "eee", "bbb", "ddd" };
int liczby[ile] = { 2, 5, 3, 1, 4 };
char napis[ile+1] = "caebd";

struct wiekszyCStr
{
   bool operator()(const char * const &dane1, const char * const &dane2)
   {
      return strcmp(dane1, dane2) > 0;
   }
};

int main(int argc, char* argv[])
{
   sortownik<const char*, wiekszyCStr>::sortuj(ile, napisy);
   for(int i = 0; i < ile; i++) cout << napisy[i] << endl;
   cout << endl;

   sortownik<int>::sortuj(ile, liczby);
   for(int i = 0; i < ile; i++) cout << liczby[i];
   cout << endl;

   sortownik<char>::sortuj(ile, napis);
   cout << napis << endl;

   cin.get();
   return 0;
}
0

adf88: Nie masz wrażenia, że Twoje rozwiązanie jest jednak trochę skomplikowane jak na rozwiązanie problemu, którym jest sortowanie tablicy?

Fajnie jest to rozwiązane w std::sort z STLa. Po prostu trzecim argumentem jest 'porównywacz'.

0

Problemem jest sortowanie tablicy dowolnego typu. Trzeba mieć również możliwość zdefiniowania operacji porównania dwóch elementów (np. aby móc sortować cstringi). Jedyne co dorzuciłem ekstra, to "zamieniacz" służacy do zamiany dwóch elemntów w tablicy. Nie zawsze chcemy wywołać operator przypisania, np. sortując std::string wystarczy, że zamienimy zawartością bajt w bajt obiekty klasy string.
Ten porównywacz trzeba jakoś przekazać. Ja wymyśliłem, że akurat będzie to parametr szablonu - klasa ze zdefiniowanym operatorem (), tak to jest w STL robione np. przy std::set.

0

Już działa dzięki.

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