sortowanie wektora struktur

0

Witam, mam problem. Próbuję posortować wektor struktur w klasie aczkolwiek wyskakuje mi błąd: no matching function for call to sort. mógłbym prosić o wyjaśnienie dlaczego ten błąd się pojawia. poniżej kod programu

 
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <algorithm>

using namespace std;

struct Dane
{
   string klasa;
   int l_uczniow;
   int l_ksiazek;
};

class Klasa
{
public:

    //string imie;
    Dane dane;
    vector<Dane> szkola;

    void WprowadzDane()
    {
        cout << "Wprowadz klase: ";
        cin >> dane.klasa;

        cout << "\nWprowadz liczbe uczniow w klasie: ";
        cin >> dane.l_uczniow;

        cout << "\nWprowadz ilosc przeczytanych ksiazek: ";
        cin >> dane.l_ksiazek;

        szkola.push_back(dane);
    }

    void SredniaPrzeczytanychKsiazek()
    {
        //int suma = 0;

        for (int i = 0; i < szkola.size(); i++)
        {
            cout << "Srednia przeczytnych ksiazek klasy " << szkola[i].klasa << " wynosi: " << szkola[i].l_ksiazek/szkola[i].l_uczniow << "\n";
        }

        //return suma/szkola.size();
    }

    bool fcjaPorownujaca(const Dane& a, const Dane& b)

    { return (a.l_ksiazek > b.l_ksiazek); }

    void Sortowanie()
    {
        sort(szkola.begin(), szkola.end(), fcjaPorownujaca);

        cout << "1. miejsce zajela klasa: " << szkola[0].klasa << "\n";
        cout << "2. miejsce zajela klasa: " << szkola[1].klasa << "\n";
        cout << "3. miejsce zajela klasa: " << szkola[2].klasa << "\n";
    }

    void ZapisDoPliku(char plik[])
    {
        // wybor;
        ofstream zm_plik;

        zm_plik.open(plik,ios_base::app);


        for (int i = 0; i < szkola.size(); i++)
        {
            zm_plik << szkola[i].klasa << " zawiera " << szkola[i].l_uczniow << " uczniow,\n ";
            zm_plik << "przeczytali oni: " << szkola[i].l_ksiazek << " ksiazek.\n\n\n";
        }

        for (int i = 0; i < szkola.size(); i++)
        {
            zm_plik << "Srednia przeczytnych ksiazek klasy " << szkola[i].klasa << " wynosi: " << szkola[i].l_ksiazek/szkola[i].l_uczniow << "\n";
        }



        //zm_plik <<

        zm_plik.close();
    }

};

int pokaz_menu()
  {
  	int wyb;

  	system("cls");
  	cout<<"                  MENU"<<endl<<endl;
  	printf("\nCo chcesz zrobic? Wybierz odpowiednia liczbe:\n\n");
        cout<<"1: Uzupelnic dane?\n";
        cout<<"2: Wyswietlic srednia arytmetyczna przeczytnych ksiazek?\n";
        cout<<"3: Wyswietlic najlepsze klasy w czytaniu?\n";
        cout<<"4: Zapis do pliku?\n";
        cout<<"5: Wyjsc z programu?\n";

  	         while(!(cin>>wyb))
             {
                 cin.clear();
                 cin.sync();
                 cout << "Wprowadz liczb3!!! \n";
             }
  	return  wyb;
  }

int main()
{
    char nazwaPliku[20];
    Klasa klasa;

    do
    {
        int wybor = pokaz_menu();
        char kontynuowac = 't';

        switch(wybor)
        {
        case 1:
            {
                do
                {
                    klasa.WprowadzDane();
                    cout << " Kontynuowac? t/n: ";
                    cin >> kontynuowac;

                } while (kontynuowac == 't');

                break;

            }
        case 2:
            {
                //cout << "Srednia przeczytnych ksiazek wynosi: ";
                klasa.SredniaPrzeczytanychKsiazek();

                break;
            }
        case 3:
            {
                klasa.Sortowanie();


                break;
            }
        case 4:
            {
                cout << "Podaj nazwe pliku: ";
                cin >> nazwaPliku;

                klasa.ZapisDoPliku(nazwaPliku);

                break;
            }
        case 5:
            {
                exit(1);
                break;
            }
        default:
            break;
        }

        cout << "Wcisnij dowolny przycisk zeby kontynuwac";
        getch();

    } while (true);


    getch();
    return 0;
}



4
sort(szkola.begin(), szkola.end(), fcjaPorownujaca);

fcjaPorownujaca jest metodą klasy (po co?).

Rozwiązania:

  1. przenieś fcjaPorownujaca poza definicję klasy.

  2. użyj std::bind/lambdy aby wywołać fcjaPorownujaca dla danej instancji klasy Klasa (w tym wypadku bezsens):

sort(szkola.begin(), szkola.end(), std::bind(&Klasa::fcjaPorownujaca, this, std::placeholders::_1, std::placeholders::_2));
sort(szkola.begin(), szkola.end(), [this](Dane const& l, Dane const& r){ return fcjaPorownujaca(l,r); });
  1. użyj lambdy bezpośrednio w wywołaniu std::sort
sort(szkola.begin(), szkola.end(), [](Dane const& l, Dane const& r){ return r.l_ksiazek < l.l_ksiazek; });

Przy okazji:

Dane dane;

Po co to w definicji klasy? Używasz wyłącznie w jednej funkcji, dlaczego więc nie jest jej zmienną?

cout << "Srednia przeczytnych ksiazek klasy " << szkola[i].klasa << " wynosi: " << szkola[i].l_ksiazek/szkola[i].l_uczniow << "\n";

dzielisz int/int, nie da Ci to oczekiwanych wyników (np. 5/3 daje wynik 1). Spróbuj static_cast<double>(szkola[i].l_ksiazek)/szkola[i].l_uczniow lub 1.*szkola[i].l_ksiazek/szkola[i].l_uczniow

0

dziękuję. można zamknąć

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