在struct array中按字母顺序排序

时间:2015-04-04 16:44:57

标签: c++ arrays sorting struct tolower

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

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来比较两个struct数组的Title元素。但是,编译器不允许我运行程序,因为它说没有匹配函数来调用tolower

当我将if语句切换为:

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

&#34;没有匹配功能&#34;消息消失但被新的消息取代:没有可行的转换来自&#39; string&#39; (又名&#39; basic_string,allocator&gt;&#39;)到&#39; int&#39;

最后,我收到了有关if语句正文中的详细信息的一致错误消息,指出temp = list[count]和{{1}中没有可行的重载&#39; =&#39; }}

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

其次,Carl对于temp是一个字符串是正确的(它应该是一本书),但是,还有另一个大问题,如果您计划以这种方式进行,那么您正在复制“Book”类。根据类的大小,这可能在计算上很困难。如果你必须多次“排序”一个数组,我建议你有一个指针数组来加速交换功能。

最后,冒泡排序很糟糕,不要使用它。如果需要始终排序的集合,请使用二叉搜索树或散列。如果你必须对一个数组进行排序,那么“默认”选项就是Quicksort,它有很多在线资源,所以我不打算发布它的方法。