C++ string Сортировка строк без векторов, мультисетов и без всего подобного

Сайт не является учебником по программированию. Это только небольшой авторский сборник информации в помощь начинающим программистам.

Предлагаю вашему вниманию решение одной из задач.
Задача на сортировку строк, когда вводится неопределенное число строк.

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

В общем, это такая смесь между очевидным решением знающих язык людей и старыми способами решений.
Я буду использовать std::string.

Что такое скомпилированная строка? В этом материале под этот термин попадает такая строка, которая собрана из нескольких строк. Просто к каждой строке добавляется некоторый разделитель. В моем случае этот разделитель есть символ ‘/n’, после добавления очередного разделителя строка склеивается со следующей строкой, считанной с клавиатуры. Так получается одна строка, содержащая много таких разделителей. Другими словами из множества получаемых строк я делаю только одну строку.

Зачем это надо?. Это надо, чтобы написать программу, которая будет считывать неизвестное заранее число строк. Если бы было известно, то можно предложить указать ввести количество строк и вводить, но вот неизвестно и все. Это ограничение я и обхожу таким путем.

Так как происходила склейка разных строк, то нужно предусмотреть расклеивание такой одной строки во много строк. Такое расклеивание эффектнее если указывать номер строки и получать непосредственно ту строчку, которая была введена под этим номером. (первая, вторая, пятая или десятая). В общем, нужно научить программу вытаскивать правильную строчку.

Чтобы понять функцию с вытаскиванием, нужно хорошо ориентироваться во вложенных циклах. Там всего один вложен в другой, поэтому если не понимаете, то я даже не знаю как еще разжевать. Есть разделитель, который мы впихивали в компилируемую строчку. Есть номер строчки. Согласно этому номеру строчки, разделитель несколько раз пропускается в цикле и если известно, что текущее выполнение цикла предпоследнее, то тогда начинаем собирать строчку, которая и будет строкой, взятой по номеру. Вот и весь алгоритм.

Функция сортировки строк — это обычная пузырьковая сортировка. Должны быть знакомы и нужно уметь ее писать, ибо она очень проста и легка к запоминанию. Единственное, что может быть непонятно, это c_str(). Этот c_str() используют, чтобы получить СИ-строку.

Нужно это, чтобы можно было работать с функциями, которые работают не со строкой типа string, а со строками типа char*

Теперь дело за малым. После того как мы считали данные с клавиатуры у наc сразу посчитано количество строчек и мы можем обратиться к любой из введенных строчек. Создаем массив типа string, указывая, что в нем столько строчек, сколько мы ввели с клавиатуры и запихиваем в него данные. Выполняем функцию сортировки и получаем массив строк, отсортированный в нужном виде.

Можно не писать функции склейки строки и вытаскивания нужной, но тогда придется указывать количество вводимых строк. Код будет намного меньше и делать так проще, но этот пример не может быть бесполезным. В реальности, конечно, это решают другим способом. Но для навыков пригодится. Да и адаптировать его на пример вообще без string не должно составить труда, тогда вообще решение без STL получается, а это значит, что оно пригодное для старых компиляторов. (не пробовал, но выглядит так, что совсем мало переделывать)

Вот так вот и подошло к концу мое объяснение. Надеюсь кому-то это облегчит нелегкую жизнь студента 🙂

Сортировка строк

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Яндекс.Метрика

НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Демотиватор эфолюция человека

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок