Εργαστήριο Τεχνολογίας Λογισμικού
0 votes
282 views
#include <iostream>
#include <algorithm>
#include <list>
#include <functional>
using namespace std;
int main () {
	list<int> a;
    for (int i= 0; i<10; i++) a.push_back(i);
    cout << a.size();
    partial_sort(a.begin(), a.begin()+3, a.end(),  greater<int>());
    for (int x:a) cout << x << endl;  
	return 0;
}

Γράφω στο eclipse αυτό το απλό προγραμματάκι για εξάσκηση αλλά ο compiler δεν το μεταγλωτίζει και μου βγάζει λάθος στη γραμμή με το partial_sort. Συγκεκριμένα μου βγάζει το μήνυμα:
Description Resource Path Location Type
no match for 'operator+' (operand types are 'std::__cxx11::list::iterator' {aka 'std::_List_iterator'} and 'int') main.cpp /dummy2 line 16 C/C++ Problem

Παρόμοια μηνύματα σφάλματος παίρνω όταν προσπάθησα να χρησιμοποιήσω άλλους αλγόριθμους ταξινόμησης της algorithm όπως η sort και η stable_sort. Ξέρει κανείς τι μπορεί να πηγαίνει στραβά;

in progtech by (550 points) | 282 views

1 Answer

+3 votes
Best answer

TL;DR: Στις λίστες δεν μπορείς να γράψεις a.begin()+3.

Ο iterator που υποστηρίζει η std::list είναι τύπου Bidirectional Iterator. Αυτό σημαίνει ότι αν έχεις έναν list::iterator a μπορείς να τον αυξήσεις με a++ (ή ++a), να τον μειώσεις με a-- (ή --a), όμως δεν μπορείς να γράψεις a+3.
Αυτό συμβαίνει επειδή στην λίστα δεν μπορείς να βρεις το 3ο στοιχείο αν δεν "περάσεις" πρώτα από το 1ο και το 2ο. Γενικά η partial_sort απαιτεί να έχεις Random Access Iterators, οπότε δεν μπορείς να την χρησιμοποιήσεις σε μια λίστα.
Αν θέλεις να ταξινομήσεις μια λίστα, μπορείς να χρησιμοποιήσεις το list::sort.

by (2.9k points)
selected by
0

Ευχαριστώ

301 questions

289 answers

288 comments

908 users