• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ sortowanie własnych typów danych

VPS Starter Arubacloud
0 głosów
234 wizyt
pytanie zadane 24 października 2017 w C i C++ przez jankustosz1 Nałogowiec (35,880 p.)

Cześć.

struct Punkt
{
public:
    int osoba;
    int pozycja;
    bool czyRozpoczyna;
};
bool sortowaniePoPozycji(Punkt &a, Punkt &b)
{
    return a.pozycja < b.pozycja;
}

... w mainie
vector<Punkt> punkty;
....... dodawanie elementow
sort(punkty.begin(), punkty.end(), sortowaniePoPozycji);

Taki kod u mnie w defaultowym kompilatorze code block g++ takie coś się kompiluje, a jak wysyłam na platformę z zadaniami, wypluwa błąd. kompilacji:

    In file included from /usr/include/c++/4.8/algorithm:62:0,
                 from /usr/include/i386-linux-gnu/c++/4.8/bits/stdc++.h:64,
                 from /tmp/sioworkers_J8WNPI/a.cpp:1:
/usr/include/c++/4.8/bits/stl_algo.h: In instantiation of '_RandomAccessIterator std::__unguarded_partition(_RandomAccessIterator, _RandomAccessIterator, const _Tp&, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Punkt*, std::vector<Punkt> >; _Tp = Punkt; _Compare = bool (*)(Punkt&, Punkt&)]':
/usr/include/c++/4.8/bits/stl_algo.h:2296:78:   required from '_RandomAccessIterator std::__unguarded_partition_pivot(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Punkt*, std::vector<Punkt> >; _Compare = bool (*)(Punkt&, Punkt&)]'
/usr/include/c++/4.8/bits/stl_algo.h:2337:62:   required from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Punkt*, std::vector<Punkt> >; _Size = int; _Compare = bool (*)(Punkt&, Punkt&)]'
/usr/include/c++/4.8/bits/stl_algo.h:5490:44:   required from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<Punkt*, std::vector<Punkt> >; _Compare = bool (*)(Punkt&, Punkt&)]'
/tmp/sioworkers_J8WNPI/a.cpp:46:59:   required from here
/usr/include/c++/4.8/bits/stl_algo.h:2263:35: error: invalid initialization of reference of type 'Punkt&' from expression of type 'const Punkt'
    while (__comp(*__first, __pivot))
                                   ^
/usr/include/c++/4.8/bits/stl_algo.h:2266:34: error: invalid initialization of reference of type 'Punkt&' from expression of type 'const Punkt'
    while (__comp(__pivot, *__last))
                                  ^

może mi ktoś powiedzieć czemu takie coś się dzieje?

komentarz 24 października 2017 przez MetRiko Nałogowiec (37,110 p.)
Zobacz w dokumentacji co jest napisane o funkcji std::sort:
http://en.cppreference.com/w/cpp/algorithm/sort
Następnie znajdź przeciążenie, którym się posługujesz..
U Ciebie to będzie (3)
Na końcu sprawdź jak powinien wyglądać trzeci argument i przeczytaj jego opis.. od razu mówię.. nie skupiaj się na nazewnictwie zmiennych tylko na samym ich typie ;)
PS. Przydało by się trochę więcej kodu.. bo rozwiązanie, które podałem oparte jest tylko na tym co wysłałeś.
komentarz 24 października 2017 przez jankustosz1 Nałogowiec (35,880 p.)
Dodałem słówko const do referencji i teraz działa. Trochę dziwne że ten sam kompilator (g++) na windowsie u mnie takie coś kompiluje a na linuksie (na nim mają sprawdzarkę) jest błąd.

1 odpowiedź

0 głosów
odpowiedź 24 października 2017 przez criss Mędrzec (172,590 p.)
wybrane 24 października 2017 przez jankustosz1
 
Najlepsza

Widocznie w implementacji std::sort na tamtejszym kompilatorze wskazane __first i __last są wskaźnikami na const typ.

Wygląda to tak, że:

const int ci;
int i;

const int * cptr = &i; // ok
int * ptr = &ci; // nope

Czyli adres zmiennej typu T przypiszesz do wskaźnika const T*, ale odwrotnie - adres zmiennej typu const T do wskaźnika T* - już nie (tzn. jakbyś się postarał, to byś dał rade, ale nie tak prosto). Te same zasady dotyczą referencji.

Czyli jeśli zmienisz nieco twoją funkcję, żeby parametry były const (const Punkt &), to powinno być ok.

Podobne pytania

0 głosów
1 odpowiedź 481 wizyt
pytanie zadane 25 grudnia 2017 w PHP przez mi-20 Stary wyjadacz (13,190 p.)
0 głosów
1 odpowiedź 195 wizyt
0 głosów
2 odpowiedzi 261 wizyt
pytanie zadane 25 maja 2020 w C i C++ przez MKolaj15 Bywalec (2,270 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...