1

構造体配列に格納されたインベントリをバブル ソートしようとすると、次のコードをコンパイルすると 2 つの異なるエラーが発生します。

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 を使用して、2 つの構造体配列の Title 要素を比較したいと考えています。ただし、 tolower を呼び出す一致する関数がないと表示されるため、コンパイラはプログラムを実行できません。

if ステートメントをこれに切り替えると、次のようになります。

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

「一致する関数がありません」というメッセージは消えますが、新しいメッセージに置き換えられます: 'string' (別名 'basic_string, allocator >') から 'int' への実行可能な変換はありません

最後に、if ステートメントの本文のステートメントに関する一貫したエラー メッセージが表示されtemp = list[count]ますlist[count + 1] = temp

最後の詳細: list は構造体データ型として宣言された配列です。私は何を間違っていますか?

4

2 に答える 2

1
  1. tolower文字列ではなく、単一の文字で機能します。std::string を小文字に変換する方法を確認してください。
  2. Bookaを aに割り当てようとしていますstring(またはその逆)。の種類を変更しtempます。
于 2015-04-04T16:50:16.610 に答える
0

まず、Carl Norum が述べたように、tolower() は文字列ではなく文字で動作します。

第 2 に、カールは temp が文字列であることについては正しい (それは本であるべきです) が、別の大きな問題があります。このようにしようとすると、「Book」クラスをコピーすることになります。クラスのサイズによっては、計算が困難になる場合があります。配列を複数回「ソート」する必要がある場合は、ポインターの配列を使用して swap 関数を高速化することをお勧めします。

最後に、バブル ソートはひどいので、使用しないでください。常にソートされるセットが必要な場合は、二分探索木またはハッシュを使用します。配列をソートする必要がある場合、「デフォルト」のオプションは Quicksort です。これにはオンラインで大量のソースがあるため、その方法を投稿するつもりはありません。

于 2015-04-04T16:59:22.370 に答える