Συμφωνώ με την απάντηση του @lykmast. Θέλω όμως να προσθέσω το παρακάτω στο (β).
H list<T>::sort
προφανώς μπορεί να χρησιμοποιηθεί μόνο για λίστες που έχουν προκύψει από το list
της STL. Μάλλον όμως η ερώτηση αναφερόταν στο γενικό αλγόριθμο std::sort
.
Το παρακάτω πρόγραμμα δεν κάνει compile:
#include <algorithm>
#include <list>
using namespace std;
int main() {
list<int> l;
l.push_back(17);
l.push_back(42);
l.push_back(7);
sort(l.begin(), l.end());
}
Στη γραμμή με την κλήση στην std::sort
προκύπτει μία τεράστια σειρά από περίεργα μηνύματα σφάλματος, τα οποία, αν τα αποκρυπτογραφήσει κανείς, σημαίνουν ότι η δομή list<int>
δεν υποστηρίζει ό,τι χρειάζεται για να μπορεί να εκτελεστεί η std::sort
, και συγκεκριμένα:
- Τελεστή αφαίρεσης δύο iterators, για να βρεθεί το πλήθος των στοιχείων που παρεμβάλλονται.
- Τελεστές σύγκρισης δύο iterators, για να βρεθεί ποιο στοιχείο προηγείται στη λίστα.
- Τελεστή πρόσθεσης ακεραίου σε iterator, για να προσπελάσουμε οποιοδήποτε στοιχείο της λίστας σε $O(1)$.
Το πρόβλημα λοιπόν δεν είναι ότι τα παραπάνω δεν υποστηρίζονται αποδοτικά, είναι ότι δεν υποστηρίζονται καθόλου. Αυτό είναι επιλογή σχεδίασης της STL, να μην υλοποιήσει τα παραπάνω ακριβώς επειδή δε θα μπορούσε να τα υλοποίησει αποδοτικά (δηλαδή σε $O(1)$).
Αν θέλεις να υλοποιήσεις τις δικές σου λίστες που να μπορούν να χρησιμοποιηθούν με την std::sort
, μπορείς να το κάνεις υπό την προϋπόθεση ότι θα έχεις υλοποιήσει τα παραπάνω. Δε βλέπω γιατί θα ήθελες να το κάνεις αυτό --- ο αλγόριθμος που χρησιμοποιεί η std::sort
βασίζεται στην υπόθεση ότι έχεις random access στα στοιχεία του container. Αυτό δεν ισχύει για τις λίστες και εκεί έχεις άλλους τρόπους να τις ταξινομήσεις αποδοτικά (βλ. list<T>::sort
).