1

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

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

“无匹配函数”消息消失了,但被一个新消息取代:没有从 'string' (aka 'basic_string, allocator >') 到 'int' 的可行转换

最后,我收到一条关于 if 语句正文中的语句的一致错误消息,指出在and中没有可行的重载 '='temp = list[count]list[count + 1] = temp

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

4

2 回答 2

1
  1. tolower适用于单个字符,而不是字符串。查看如何将 std::string 转换为小写?
  2. 您正在尝试将 a 分配Book给 a string(反之亦然)。更改类型temp
于 2015-04-04T16:50:16.610 回答
0

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

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

最后,冒泡排序很糟糕,不要使用它。如果您需要一个始终排序的集合,请使用二叉搜索树或哈希。如果您必须对数组进行排序,“默认”选项是 Quicksort,它有大量的在线资源,所以我不会发布它的操作方法。

于 2015-04-04T16:59:22.370 回答