当尝试对存储在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数据类型的数组。我做错了什么?
答案 0 :(得分:1)
tolower
适用于单个字符,而不是字符串。查看How to convert std::string to lower case? Book
分配给string
(反之亦然)。更改temp
。答案 1 :(得分:0)
我认为你是C ++的新手,首先,正如Carl Norum所提到的,tolower()适用于char,而不是字符串。
其次,Carl对于temp是一个字符串是正确的(它应该是一本书),但是,还有另一个大问题,如果您计划以这种方式进行,那么您正在复制“Book”类。根据类的大小,这可能在计算上很困难。如果你必须多次“排序”一个数组,我建议你有一个指针数组来加速交换功能。
最后,冒泡排序很糟糕,不要使用它。如果需要始终排序的集合,请使用二叉搜索树或散列。如果你必须对一个数组进行排序,那么“默认”选项就是Quicksort,它有很多在线资源,所以我不打算发布它的方法。