0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
1

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

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

Author24 — интернет-сервис помощи студентам
Недавно мой знакомый рассказывал что-то про sort,говорил что с помощью него можно сортировать как хочешь и что хочешь,с сортировкой qSort и так понятно,но так же он упоминал что и сортировка по алфавитному порядку и т.п тоже есть,но сколько бы я не сёрфил интернет,я так и не смог выяснить пару нужных вещей для меня,а именно:
1.Как работает сама функция Sort?
2.Что из себя представляет компаратор и как он работает?
3.Возможно ли сделать с помощью этой функции сортировку по лексикографическому порядку(алфавитному),и другие,по типу по длине строк и так далее и нужно ли для этого писать массивный код ?
Очень надеюсь на помощь тех кто разбирается в этом,так же был бы очень благодарен если бы к ответам прилагались примеры в виде кода.
Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
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
447 / 333 / 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
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
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
27709 / 17327 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
18.01.2019, 00:24 5
Daniil__, Что есть сортировка? Это процедура, состоящая из двух вещей: Сравнения и перестановки. Переставлять-то она умеет. И ЧТО сравнивать - тоже. (В этом-то все ее искусство!) А вот КАК именно сравнивать, что ты считаешь больше, а что меньше - это она не в курсах. И вот она вызывает твой "компаратор" (впервые слышу этот термин, но он понятен), то есть функцию твою, где ты ей и объясняешь свои приоритеты.
1
0 / 0 / 0
Регистрация: 17.01.2019
Сообщений: 7
18.01.2019, 00:25  [ТС] 6
Спасибо за информацию!
0
447 / 333 / 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
27709 / 17327 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
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
27709 / 17327 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
18.01.2019, 00:36 11
Цитата Сообщение от Daniil__ Посмотреть сообщение
там 2 издание,стоит ли читать первое и третье?С какого начать?
Сортировка, это тема, появившаяся еще до царствия царя Гороха. Читай любое.

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

Добавлено через 19 минут
Цитата Сообщение от Daniil__ Посмотреть сообщение
Какие есть ещё хорошие книги?
Литература C++
1
18.01.2019, 09:29
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.01.2019, 09:29
Помогаю со студенческими работами здесь

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

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

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

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


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

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

Новые блоги и статьи
Интеграция Arduino и ChatGPT: Практическое руководство
InfoMaster 16.01.2025
В современную эпоху технологических инноваций интеграция искусственного интеллекта с микроконтроллерами открывает принципиально новые возможности для создания умных устройств и автоматизированных. . .
Как создать робота, управляемого ChatGPT
InfoMaster 16.01.2025
Концепция проекта В современную эпоху искусственный интеллект и робототехника становятся все более доступными для энтузиастов и разработчиков. Создание роботизированной руки, управляемой ChatGPT,. . .
Как создать ChatGPT бота в Telegram на Python
InfoMaster 16.01.2025
В современном мире технологии искусственного интеллекта становятся все более доступными для разработчиков, открывая новые возможности для создания умных и интерактивных приложений. Одним из самых. . .
Машинное обучение с помощью Python
InfoMaster 16.01.2025
Машинное обучение стало неотъемлемой частью современных технологий, позволяя компьютерам учиться на основе данных и принимать решения без явного программирования. В сочетании с языком. . .
Использование связки C# и PHP в корпоративной разработке и микросервисной архитектуре
InfoMaster 16.01.2025
Введение в интеграцию C# и PHP В современной корпоративной разработке все чаще возникает потребность в создании гибких и масштабируемых решений, способных эффективно решать широкий спектр. . .
Как использовать Kerio дома для управления сетью и пользователями
InfoMaster 16.01.2025
Использование технологий для улучшения повседневной жизни стало неотъемлемой частью современного быта. Одной из таких технологий является Kerio — мощный инструмент для управления сетью и. . .
Есть ли будущее у DVD и Blu-ray?
InfoMaster 16.01.2025
В эпоху стремительного развития цифровых технологий и повсеместного распространения потоковых сервисов вопрос о будущем физических носителей информации становится все более актуальным. Особенно остро. . .
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru