Проблема с сортировкой пузырьков по алфавиту в массиве структур

При попытке пузырьковой сортировки инвентаря, хранящегося в массиве структур, я получаю две разные ошибки при компиляции кода ниже:

void SORT_INVENTORY(Books* list, int max, int position)
{
        bool swap;
        string temp;

        do
        {
                swap = false;
                for (int count = 0 ; count < (position - 1) ; count++)
                {
                        if ( tolower(list[count].Title) > tolower(list[count + 1].Title)) 
                        {
                                temp = list[count];
                                list[count] = list[count + 1];
                                list[count + 1] = temp;
                                swap = true;
                        }
                }
        } while (swap);

Я хочу использовать tolower для сравнения элемента Title двух массивов структур. Однако компилятор не позволяет мне запустить программу, потому что он говорит, что нет подходящей функции для вызова tolower.

Когда я переключаю оператор if на это:

if ( ::tolower(list[count].Title) > ::tolower(list[count + 1].Title)) 

Сообщение «функция не соответствует» исчезает, но заменяется новым: невозможно преобразовать «строку» (также известную как «базовая_строка, распределитель >») в «целое число».

Наконец, я получаю последовательное сообщение об ошибке, касающееся statments в теле оператора if, в котором говорится, что нет жизнеспособных перегруженных '=' в temp = list[count] и list[count + 1] = temp.

И последняя деталь: list — это массив, объявленный как тип данных struct. Что я делаю не так?


person jshapy8    schedule 04.04.2015    source источник


Ответы (2)


  1. tolower работает с одним символом, а не со строкой. Ознакомьтесь с Как преобразовать std::string в нижний регистр?
  2. Вы пытаетесь присвоить Book string (и наоборот). Измените тип temp.
person Carl Norum    schedule 04.04.2015
comment
Я изменил тип данных temp с string на Books, и это устранило нежизнеспособную перегруженную ошибку '='. Спасибо! К сожалению, в отношении if (list[count].Title > list[count + 1].Title) до сих пор не существует жизнеспособного преобразования из 'string' (он же 'basic_string, allocator ›') в 'int'. - person jshapy8; 04.04.2015
comment
Вот о чем № 1 в моем ответе. - person Carl Norum; 04.04.2015
comment
Поэтому я выполнил действия, предложенные по ссылке, которую вы предоставили. Спасибо за это. Сорт вроде как работает. Последняя запись в моем массиве по какой-то причине не сортируется. Я использовал transform(list[count].Title.begin(), list[count].Title.end(), list[count].Title.begin(), ::tolower); перед оператором if. Возможно ли, что это ошибка из-за использования пузырьковой сортировки? Будет ли сортировка выбором лучше? - person jshapy8; 04.04.2015
comment
Не берите в голову! Исправлена ​​эта проблема, удалив позицию - 1 и сделав просто позицию. Другая часть моей программы делала массив по одному. Теперь мне просто нужно выяснить, как восстановить буквы, которые были заглавными после сортировки - person jshapy8; 04.04.2015

Я так понимаю, вы новичок в С++, во-первых, как упомянул Карл Норум, tolower() работает с символами, а не со строками.

Во-вторых, Карл прав в том, что temp является строкой (это должна быть книга), но есть еще одна большая проблема: вы копируете класс «Книга», если планируете делать это таким образом. В зависимости от размера класса это может быть сложно с точки зрения вычислений. Если вам нужно «сортировать» массив несколько раз, я бы предложил иметь массив указателей для ускорения функции подкачки.

Наконец, пузырьковая сортировка ужасна, не используйте ее. Если вам нужен набор, который всегда сортируется, используйте двоичное дерево поиска или хэш. Если вам нужно отсортировать массив, параметр «по умолчанию» — это Quicksort, который имеет множество источников в Интернете, поэтому я не собираюсь публиковать, как это сделать.

person Jonathan Bedard    schedule 04.04.2015