结构数组中按字母顺序排序的问题气泡

Trouble bubble sorting alphabetically in struct array

当尝试对存储在结构数组中的库存进行冒泡排序时,我在编译以下代码时遇到了两个不同的错误:

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)) 

"no matching function" 消息消失但被新消息取代:没有从 'string'(又名 'basic_string, allocator >')到 'int' 的可行转换

最后,我收到一条关于 if 语句正文中语句的一致错误消息,指出 no viable overloaded '=' in temp = list[count] and list[count + 1] = temp.

最后一个细节:列表是声明为结构数据类型的数组。我做错了什么?

  1. tolower 适用于单个字符,而不适用于字符串。查看 How to convert std::string to lower case?
  2. 您正在尝试将 Book 分配给 string(反之亦然)。更改 temp.
  3. 的类型

我认为你是 C++ 的新手,首先,正如 Carl Norum 提到的,tolower() 适用于字符,而不是字符串。

其次,卡尔关于 temp 是一个字符串(它应该是一本书)是正确的,但是,还有另一个大问题,如果你打算这样做,你正在复制 "Book" class就这样根据 class 的大小,这在计算上可能很困难。如果您必须多次 "sort" 一个数组,我建议使用一个指针数组来加速交换函数。

最后,冒泡排序很糟糕,不要使用它。如果您需要一个始终排序的集合,请使用二叉搜索树或哈希。如果您必须对数组进行排序,"default" 选项是 Quicksort,它在网上有大量资源,所以我不打算 post 如何进行排序。