【问题标题】:Trouble bubble sorting alphabetically in struct array在结构数组中按字母顺序进行冒泡排序
【发布时间】:2015-04-04 16:44:57
【问题描述】:

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

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

“无匹配函数”消息消失,但被新消息取代:没有从“字符串”(又名“基本字符串,分配器>”)到“整数”的可行转换

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

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

【问题讨论】:

    标签: c++ arrays sorting struct tolower


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

    【讨论】:

    • 我将temp 的数据类型从string 更改为Books,从而消除了“没有可行的重载'='”错误。谢谢!不幸的是,关于if (list[count].Title &gt; list[count + 1].Title),“从'string'(又名'basic_string,分配器>')到'int'的转换不可行”仍然存在
    • 这就是我的回答中的第一条。
    • 所以我执行了您提供的链接建议的操作。感谢那。那种似乎正在工作,有点。由于某种原因,我的数组中的最后一个条目没有排序。我在 if 语句之前使用了transform(list[count].Title.begin(), list[count].Title.end(), list[count].Title.begin(), ::tolower);。由于使用冒泡排序,这可能是一个错误吗?选择排序会更好吗?
    • 没关系!通过删除位置 - 1 并调整位置来解决该问题。我的程序的另一部分使数组分开。现在我只需要弄清楚如何恢复排序后大写的字母
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 2018-10-24
      • 2020-09-14
      • 2011-07-16
      • 2016-03-11
      • 2017-06-18
      相关资源
      最近更新 更多