Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Ronan
1 / 1 / 0
Регистрация: 28.06.2013
Сообщений: 29
#1

Сортировка std::list - C++

02.08.2013, 04:53. Просмотров 1310. Ответов 12
Метки нет (Все метки)

Есть такой фрагмент програми. Создаю функцию для сортировки list. Вроде все правильно. В класе перегружены оператори < i =. Не знаю что делать. List просто не сортируеться а ввыводиться в изначальном виде. Может есть еще какие то методи отсортировать???
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void sortL(L  &v){
    int k=v.size();
    Student temp,a,b;
    L::iterator z = v.begin();
    for (int i = 0; i < k; i++)
         for (int j = i + 1; j < k; j++){
            advance(z,i);
            a=*z;
            advance(z,j);
            b=*z;
            if (a<b) {
                temp = a;
                a = b;
                b = temp;
            }
        }
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2013, 04:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка std::list (C++):

Сортировка в std::list состоящем из объектов класса - C++
Добрый день. Вопрос в следующем. Допустим у нас есть некий класс A и класс B. В классе B есть list из объектов класса A. Вопрос, как...

Сортировка std::list ошибка компиляции algorithm 3868 error C2784 - C++
Добрый день, есть пользовательский класс, с вектором в качестве контейнера всё работает хорошо. А вот со списком вылетает ошибка: код:...

Реализация std::list, сложность list::size() - C++
Часто приходилось пользоваться Listом, но сейчас столкнулся с небольшой неоднозначностью. Согласно документации, метод size() в 11...

Потокобезопасность std::map::end, std::list::end - C++
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int') - C++
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i != Bullets.end(); /**/) В строке цикла вот...

Вопросы по std::list - C++
1. Как обменять в списке два его элемента? Желательно большое быстродействие :) т.е. без удалить оба а потом добавить в другом порядке,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Модератор
Эксперт CЭксперт С++
13154 / 7417 / 831
Регистрация: 27.09.2012
Сообщений: 18,254
Записей в блоге: 3
Завершенные тесты: 1
02.08.2013, 05:12 #2
std::list::sort
http://www.cplusplus.com/reference/list/list/sort/
Ronan
1 / 1 / 0
Регистрация: 28.06.2013
Сообщений: 29
02.08.2013, 10:28  [ТС] #3
Croessmah, я видел ето, но я сортирую объекти, и мне нужно задать параметр по которому будет проходть сортировка. Объект у меня получает 3 параметра: Student(const string &name,const int age,const int mark); Я хочу просортировать по 3 параметру. как мне это зделать с помощью функции sort? Мне кажеться віход тольо написать свою функцию, адля этого мне надо доступ ко всем елементам списка.
0x10
2460 / 1632 / 238
Регистрация: 24.11.2012
Сообщений: 4,015
02.08.2013, 10:43 #4
Цитата Сообщение от Ronan Посмотреть сообщение
Мне кажеться віход тольо написать свою функцию
Свою функцию сравнения, но не сортировки.
Ronan
1 / 1 / 0
Регистрация: 28.06.2013
Сообщений: 29
02.08.2013, 10:51  [ТС] #5
0x10, почему не сортировки? Я написал функцию для сортировки вектора и она прекрасно работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void sortV( V  &v){
    int k=v.size();
    Student temp;
    for (int i = 0; i < k; i++)
           for (int j = i+1; j < k; j++)
              if (v[i] < v[j])
              {
                 temp = v[i];
                 v[i] = v[j];
                 v[j] = temp;
              }
 
 
}
но вот в функии сортировки списка почему то не сортирует, хотя все зделано по аналогии
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
02.08.2013, 11:03 #6
Ronan, и ты не видишь разницы между этими функциями?
Не видишь, что в первой используются итераторы и используются неправильно?
Более того std::list ты не сможешь отсортировать так, как это смог бы сделать stl
Например, в своей попытке сортировки ты обмениваешь элементы по значению. (изначально неправильно делаешь, копируя элементы в student a, b; но не только это)
При этом теряется главное преимущество списков: элементы не меняют своего места в памяти при перестановках.

Добавлено через 3 минуты
Короче, почитай книгу Мейерса что ли...
Иметь итераторы и всё равно запускать циклы по счётчику i с последующим вызовом advance?
Ты серьёзно? Вообще-то advance при вызове будет повторять точно такой же цикл по второму разу, но уже с итераторами!

Добавлено через 2 минуты
Цитата Сообщение от Ronan Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
Student temp,a,b;
* * * * * * a=*z;
* * * * * * advance(z,j);
* * * * * * b=*z;
* * * * * * if (a<b) {
* * * * * * * * temp = a;
* * * * * * * * a = b;
* * * * * * * * b = temp;
* * * * * * }
А вот здесь? Ты реально думаешь, что тут что-то поменялось в списке кроме локальных переменных a и b, хранящих КОПИИ двух элементов из списка?
Ronan
1 / 1 / 0
Регистрация: 28.06.2013
Сообщений: 29
02.08.2013, 11:12  [ТС] #7
Kuzia domovenok, да канешно думаю, если б не думал то не делал так. я еще не знаю всего про с++, по етому и сижу в теме с++ для начинающих. Ы если так нельзя так как мне посортировать список?????
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2013, 17:04 #8
Цитата Сообщение от Ronan Посмотреть сообщение
так как мне посортировать список?????
Для начала нужно видеть, что он из себя представляет. Это же не list STL?
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
02.08.2013, 17:23 #9
Цитата Сообщение от alsav22 Посмотреть сообщение
Это же не list STL?
почему это? мне казалось, тема именно об STL!
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2013, 17:57 #10
Разве в list нет сортировки?
Ronan
1 / 1 / 0
Регистрация: 28.06.2013
Сообщений: 29
02.08.2013, 18:21  [ТС] #11
alsav22, Это list STL. В нем есть сортировка list::sort(). Но мне нужно отсортировать List у которого елементы это обьекты класа Student. При создании обьекта ему передаеться 3 величины : Student(const string &name,const int age,const int mark), и сортировку я хочу провести по елементу int mark. И так здесь много сказано но ничего по сути. Хотя я теперь знаю что так я делал нельзя. Может кто то скзаать как мне отсортировать list?????? Ниже приведен пример как работает сортировка вектора и не работает сортировка списка по значению оценки(mark)

Container 'Vector' sorted:
Mark is 23 years old and his(her) mark is:100
Petro is 18 years old and his(her) mark is:93
Mika is 18 years old and his(her) mark is:76
Student is 17 years old and his(her) mark is:71
Container 'List' sorted:
Harry is 23 years old and his(her) mark is:72
John is 34 years old and his(her) mark is:75
Ivan is 17 years old and his(her) mark is:88
Mark is 23 years old and his(her) mark is:100
Harry is 23 years old and his(her) mark is:72
John is 34 years old and his(her) mark is:75
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.08.2013, 18:25 #12
Цитата Сообщение от Ronan Посмотреть сообщение
В нем есть сортировка list::sort().
В нём ещё есть и такая сортировка: list::sort(Compare comp).
Croessmah, дал вам ссылку. Создайте для вашего класса функцию сравнения и сортируйте.
Ronan
1 / 1 / 0
Регистрация: 28.06.2013
Сообщений: 29
03.08.2013, 20:01  [ТС] #13
alsav22, уже в который раз спасибо.
На случай если у кого то будет подобная проблема: надо сначала написать компаратор. я его реализовал в класе с которым работаю, тоесть в классе Student написал такое переопридиление:
C++
1
2
3
bool Student::operator() (const Student &a, const Student &b ){
            return a.GetMark()<b.GetMark();
        }
Я перегрузил оператор(), но можно было и другое название. И потом вызов сортировки из main()
C++
1
 list.sort(Student());
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2013, 20:01
Привет! Вот еще темы с ответами:

Static std::list - C++
Добрый день, помогите решить проблему. &quot;Каждое статическое поле должно быть проинициализировано до main() явным образом&quot; - как я помню...

Вопрос по std::list - C++
Не произойдёт ли здесь какая-нибудь ошибка после удаления элемента из списка? std::list&lt;int&gt; myList; std::list&lt;int&gt;::iterator iter; ...

Непосредственное удаление из std::list - C++
Собственно проблема вот в чем раньше, когда я создавал игру, у меня были самодельные листы типа struct List { T data; ...

Std::list, ошибка LNK2019 - C++
Добрый день! // element.h class Element { public: Element(){}; ~Element(){};


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.08.2013, 20:01
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru