[c++] Struktury i sortowanie

0

Witam!
Mam do zrobienia takie zadanie:
http://main.edu.pl/user.phtml?op=showtask&task=sor&con=OIG1

Ponieważ chcę się nauczyć struktur, chcę to zrobić korzystając właśnie z nich.
Mój kod:

 #include <iostream>

using namespace std;
struct napis
{
    string s;
    int dl;
    napis(){};
    napis(string a, int b)
    {
        s = a;
        dl = b;
    }
    bool operator<(const napis &a, const napis &b)
    {
        if(a.dl < b.dl)
            return true;

    }
};

napis tab[150];

int main()
{
    int a, b, n;
    string s;
    cin >> n;
    for(int i=0; i<n; i++)
    {
        cin >> s;
        tab[i] = napis(s, s.size());
    }

    return 0;
}

Chciałem napisać własny operator porównania, który najpierw porównywałby po długości, a jeśli bylyby równe to leksykograficznie. Kompilator wywala mi błąd:
uterii\main.cpp|15|error: `bool napis::operator<(const napis&, const napis&)' must take exactly one argument|

Tylko, że nie rozumiem, jak funkcja porównująca dwie rzeczy, musi wziąć dokładnie jeden argument!?

Wytłumaczy to ktoś? Jak mam to napisać?

pzdr
zaiks

0

Masz za dużo argumentów. Metody klasy przyjmują jako pierwszy argument niejawnie wskaźnik *this.

 #include <iostream>
 
using namespace std;
struct napis
{
    string s;
    int dl;
    napis(){};
    napis(string a, int b)
    {
        s = a;
        dl = b;
    }
    bool operator<(const napis& b) const
    {
        this->dl < b.dl; //bo gdzie miales kiedy ma zwrócić false?
    }
};
 
napis tab[150];
 
int main()
{
    int a, b, n;
    string s;
    cin >> n;
    for(int i=0; i<n; i++)
    {
        cin >> s;
        tab[i] = napis(s, s.size());
    }
 
    return 0;
}
 
0

Jeśli funkcja porównująca jest składnikiem klasy to przyjmuje tylko jeden argument , za pierwszy operujesz dostępnym dla niej
składnikiem klasy .

 #include <iostream>

using namespace std;
struct napis
{
    string s;
    int dl;
    napis(){};
    napis(string a, int b)
    {
        s = a;
        dl = b;
    }
    bool operator<( const napis &b)
    {
        if(dl < b.dl)
            return true;

    }
};
//-----------------------------------------------------------------------------
    bool operator<( const napis&a , const napis &b)
    {
        if(a.dl < b.dl)
            return true;

    }

Funkcja porównująca dwa obiekty mająca prototyp :

bool operator<( const napis&a ,const napis &b);

Musiałaby zostać zdefiniowana jako fun. zewnętrzna .

0

Dostałem w odpowiedzi dwie wersje i trochę się zamotałem:

  1. bool operator<(const napis& b) const
           this.dl < b.dl;
                __ czy__
    bool operator<( const napis &b)
          if(dl < b.dl)
    

czego używać?
2) Dlaczego trzeba przed nazwą struktury pisać const? A w tej pierwszej wersji to jeszcze po napisaniu bool operator ...?
3) Czy koniecznie trzeba przekazywać te zmienne przez referencję?

Z góry dzięki za odpowiedź, chciałbym to zrozumieć, a nie ma o tym zbyt wiele ani w symfonii c++ (od razu jest na klasach wszystko opisane) ani w necie.
Struktury to super rzecz ;)

pzdr
zaiks

0
  1. nie this.dl tylko this->dl jak już i jest to w tym wypadku równoważne z samym dl
  2. żeby zaznaczyć że ten operator nie zmienia r-wartości, a const na końcu oznacza, że nie zmienia l-wartości (czyli obiektu na rzecz którego jest wywoływany)
  3. przekazywanie przez referencję jest szybsze i zżera mniej pamięci, no i jest bezpieczniejsze.
0

Dzięki wielkie ;)

0

jescze mam takie pytanie - lepiej definiować te operatory wewnątrz struktury czy poza nią?

0

raczej wewnątrz

0

Dlaczego trzeba przed nazwą struktury pisać const?
Dlaczego to już wiesz, ja jeszcze dodam że wcale nie trzeba. Ale jest parę powodów, dla których warto dawać const wszędzie gdzie tylko można.

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