Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
1

Не могу понять на что способен sort, и что делает его компаратор

17.01.2019, 23:44. Показов 1955. Ответов 11
Метки нет (Все метки)

Недавно мой знакомый рассказывал что-то про sort,говорил что с помощью него можно сортировать как хочешь и что хочешь,с сортировкой qSort и так понятно,но так же он упоминал что и сортировка по алфавитному порядку и т.п тоже есть,но сколько бы я не сёрфил интернет,я так и не смог выяснить пару нужных вещей для меня,а именно:
1.Как работает сама функция Sort?
2.Что из себя представляет компаратор и как он работает?
3.Возможно ли сделать с помощью этой функции сортировку по лексикографическому порядку(алфавитному),и другие,по типу по длине строк и так далее и нужно ли для этого писать массивный код ?
Очень надеюсь на помощь тех кто разбирается в этом,так же был бы очень благодарен если бы к ответам прилагались примеры в виде кода.
Заранее спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2019, 23:44
Ответы с готовыми решениями:

Не могу понять что делает функциия
map<char,int> next; int &get (char c) { if (!next.count(c)) next = -1; return next; }...

Не делает сортировку или не выводи,не могу понять что не так
Написать программу обработки файла типа запись, содержащую следующие пункты меню: «Создание»,...

Не могу понять, что делает "%="
Не могу понять, что делает "%=". Вот написал не большую програмку, но так что то и не втыкаю. ...

понять, что делает строчка кода на c++
В общем, не понимаю, что происходит в указанной строке. Массив cz типа complex в каждом своем члене...

11
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
18.01.2019, 00:10 2
Цитата Сообщение от Daniil__ Посмотреть сообщение
1.Как работает сама функция Sort?
quick sort с различнами фиксами

Цитата Сообщение от Daniil__ Посмотреть сообщение
2.Что из себя представляет компаратор и как он работает?
Компаратор - функция, возвращающая bool; судя по вики, должна принимать два параметра соответствующего типа и не изменять их

C++
1
2
sort(a, a + n); // по возрастанию
sort(a, a + n, [](const auto& a, const auto& b) { return a > b; }); // по убыванию
a, b - два любых числа, которые программа берет в процессе сравнения. То есть quick sort - сортировка сравнения, в коде которой есть:

C++
1
2
if (Comparator(a[i], a[j]))
  swap(a[i], a[j]);
Цитата Сообщение от Daniil__ Посмотреть сообщение
другие,по типу по длине строк
C++
1
2
3
4
5
6
vector<string> a(n);
 
for (auto& i : a)
  cin >> i;
 
sort(a.begin(), a.end(), [](const auto& a, const auto& b) { return a.length() < b.length(); });
Цитата Сообщение от Daniil__ Посмотреть сообщение
нужно ли для этого писать массивный код
Чем сложнее сравнение, тем больше код

Цитата Сообщение от Daniil__ Посмотреть сообщение
лексикографическому порядку(алфавитному)
sort это и так сделает без каких-либо параметров, потому что a < b < c < d < e < f и т.д.
1
14135 / 7594 / 1804
Регистрация: 30.01.2014
Сообщений: 12,704
18.01.2019, 00:16 3
Цитата Сообщение от Daniil__ Посмотреть сообщение
сколько бы я не сёрфил интернет
Читайте лучше книги.

Цитата Сообщение от Daniil__ Посмотреть сообщение
Как работает сама функция Sort?
Классически, это Quick sort, но может быть и вот такой вариант-модификация: https://en.wikipedia.org/wiki/Introsort
Читайте выше приведенную книгу. Там все есть.

Цитата Сообщение от Daniil__ Посмотреть сообщение
.Что из себя представляет компаратор и как он работает?
Это функция или функциональный объект, которые задают механизм сравнения порядка двух элементов.
Требования к этой функции можно прочитать здесь: https://en.cppreference.com/w/... eq/Compare
Также об этом есть в вышеприведенной книге.

Цитата Сообщение от Daniil__ Посмотреть сообщение
Возможно ли сделать с помощью этой функции сортировку по лексикографическому порядку(алфавитному)
Да.

Цитата Сообщение от Daniil__ Посмотреть сообщение
по типу по длине строк
Да.

Цитата Сообщение от Daniil__ Посмотреть сообщение
нужно ли для этого писать массивный код
Нет.
1
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
18.01.2019, 00:24  [ТС] 4
Цитата Сообщение от ReDoX Посмотреть сообщение
sort это и так сделает без каких-либо параметров, потому что a < b < c < d < e < f и т.д.
Если я не ошибаюсь,не сработает,грубо говоря если оно отсортирует 3 строки,такие как :abvce,c,aaaaaaa-то оно отсортирует их в таком порядке-c,abvce,aaaaaaa,хотя правильный ответ будет-aaaaaaa,abvce,c(т.к символ "а" стоит раньше по алфавиту,то он будет по лекс. <символа c,например).
0
Эксперт C
25590 / 15961 / 3417
Регистрация: 24.12.2010
Сообщений: 34,910
18.01.2019, 00:24 5
Daniil__, Что есть сортировка? Это процедура, состоящая из двух вещей: Сравнения и перестановки. Переставлять-то она умеет. И ЧТО сравнивать - тоже. (В этом-то все ее искусство!) А вот КАК именно сравнивать, что ты считаешь больше, а что меньше - это она не в курсах. И вот она вызывает твой "компаратор" (впервые слышу этот термин, но он понятен), то есть функцию твою, где ты ей и объясняешь свои приоритеты.
1
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
18.01.2019, 00:25  [ТС] 6
Спасибо за информацию!
0
443 / 329 / 172
Регистрация: 01.07.2015
Сообщений: 1,162
18.01.2019, 00:29 7
Цитата Сообщение от Daniil__ Посмотреть сообщение
Если я не ошибаюсь,не сработает,грубо говоря если оно отсортирует 3 строки,такие как :abvce,c,aaaaaaa-то оно отсортирует их в таком порядке-c,abvce,aaaaaaa,хотя правильный ответ будет-aaaaaaa,abvce,c(т.к символ "а" стоит раньше по алфавиту,то он будет по лекс. <символа c,например).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <string>
 
using namespace std;
 
int main() {
  int n;
  cin >> n;
 
  vector<string> a(n);
  for (auto& i : a)
    cin >> i;
 
  sort(a.begin(), a.end());
 
  copy(a.cbegin(), a.cend(), ostream_iterator<string>(cout, " "));
}
input:

3
abvce
c
aaaaaaa

output:

aaaaaaa abvce c
0
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
18.01.2019, 00:29  [ТС] 8
Цитата Сообщение от DrOffset Посмотреть сообщение
Читайте лучше книги.
Вы дали мне ссылку на книгу "Стандартная библиотека c++.Справочное руководство" там 2 издание,стоит ли читать перое и третье?С какого начать?Какие есть ещё хорошие книги?
0
Эксперт C
25590 / 15961 / 3417
Регистрация: 24.12.2010
Сообщений: 34,910
18.01.2019, 00:32 9
Цитата Сообщение от Daniil__ Посмотреть сообщение
я не сёрфил интернет
Ну, иногда и синапсы в собственно мозге неплохо бы поразмять
Вот сам подумай. Пишешь ты сортировку. Простейший пузырек. Писал? Если нет - попробуй. И тут тебе надо выяснить, кто больше - кто меньше. И тебе придется на каждую разную писать свое сравнение. Скушно это. Скоро тебе это надоест. Хочется универсальную сделать. Опа! Спрошу-ка я у того, кто в теме. У компаратора
0
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
18.01.2019, 00:34  [ТС] 10
Цитата Сообщение от ReDoX Посмотреть сообщение
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
#include <string>
using namespace std;
int main() {
* int n;
* cin >> n;
vector<string> a(n);
* for (auto& i : a)
* * cin >> i;
sort(a.begin(), a.end());
copy(a.cbegin(), a.cend(), ostream_iterator<string>(cout, " "));
}
Огромное Спасибо!!!!Можно спросить,ostream_iterator<string>(cout, " "),это что?
0
Эксперт C
25590 / 15961 / 3417
Регистрация: 24.12.2010
Сообщений: 34,910
18.01.2019, 00:36 11
Цитата Сообщение от Daniil__ Посмотреть сообщение
там 2 издание,стоит ли читать первое и третье?С какого начать?
Сортировка, это тема, появившаяся еще до царствия царя Гороха. Читай любое.

Добавлено через 1 минуту
Цитата Сообщение от Daniil__ Посмотреть сообщение
Можно спросить,ostream_iterator<string>(cout, " "),это что?
Законы Форума строги, но справедливы. Новый вопрос - новая тема!
0
14135 / 7594 / 1804
Регистрация: 30.01.2014
Сообщений: 12,704
18.01.2019, 09:29 12
Цитата Сообщение от Daniil__ Посмотреть сообщение
"Стандартная библиотека c++.Справочное руководство" там 2 издание,стоит ли читать перое и третье?
Читайте второе. Первое устарело. Третьего нет в природе, где вы его нашли?

Добавлено через 19 минут
Цитата Сообщение от Daniil__ Посмотреть сообщение
Какие есть ещё хорошие книги?
Литература C++
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2019, 09:29

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Не могу понять что делает LockMode.READ в Hibernate
Много разной информации по поводу этой блокировки но обычно обходятся одним предложением. Версии...

Дать понять пользователю, что программа что-то делает, а не зависла
Написал программу для поиска текста в файлах, но т.к. файлов много программа &quot;зависает&quot; на время...

Что делает Arrays.sort(...)
Arrays.sort(...)...что этот массив делаеть? Где можно подробно о нем почитать ?

Понять, что делает программа
(defun join(m l) ;возвращает в список l те его эл-ты,к-е были перенесены (cond ((null m) l) ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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