1

qsortを試してみると、私にとっては完璧に動作します。私はプログラム全体で関数ポインタを使用し、他のいくつかの機能(つまり、voidポインタなど)を使用しています。

ただし、要素を降順(つまり、昇順ではなく)に配置する必要があります。これを達成するために何ができますか?

コードは次のとおりです。

#include <iostream>
#include <cstdlib>  // Required for qsort
#include <cstring>
using std::cout;
using std::endl;

int compare_strs( const void *arg1, const void *arg2 );
int compare_ints( const void* arg1, const void* arg2 );

int main()
{
    char * shrooms[10] = 
    {
        "Matsutake", "Lobster", "Oyster", "King Boletus",
        "Shaggy Mane", "Morel", "Chanterelle", "Calf Brain",
        "Pig's Ear", "Chicken of the Woods"
    };

    int nums[10] = {99, 43, 23, 100, 66, 12, 0, 125, 76, 2};

    // The address of the array, number of elements
    // the size of each element, the function pointer to 
    // compare two of the elements
    qsort( (void *)shrooms, 10, sizeof( char * ), compare_strs ); 
    qsort( (void *)nums, 10, sizeof( int * ), compare_ints ); 

    // Output sorted lists
    for ( int i = 0; i < 10; ++i )
        cout << shrooms[i] << endl;

    for ( int i = 0; i < 10; ++i )
        cout << nums[i] << endl;

    return 0;
}

int compare_ints( const void * arg1, const void * arg2 )
{
    int return_value = 0;

    if ( *(int *)arg1 < *(int *)arg2 )
        return_value = -1;
    else if ( *(int *)arg1 > *(int *)arg2 )
        return_value = 1;

    return return_value;
}

int compare_strs( const void * arg1, const void * arg2 )
{
    return ( _stricmp( *(char **) arg1, *(char **) arg2 ) );
}

プログラムは昇順(つまり、Calf Brainで始まる)で出力されますが、私はそれをShaggy Mane(つまり、降順)で始めようとしています。どんな助けでも大歓迎です。

4

3 に答える 3

4

およびとstd::sort組み合わせて使用​​します:std::stringstd::greater

std::string shrooms[10] = 
{
    "Matsutake", "Lobster", "Oyster", "King Boletus",
    "Shaggy Mane", "Morel", "Chanterelle", "Calf Brain",
    "Pig's Ear", "Chicken of the Woods"
};

std::sort(shrooms, shrooms+10, std::greater<std::string>);

使用したくない場合std::sortは、比較関数の結果を逆にするか、結果を逆にします。

于 2013-01-20T05:20:55.450 に答える
2

std::sortを使用することをお勧めします。複雑にいじる必要はありませんqsort。また、std::string文字列の保管、およびstd::vectorそれらの保管に使用する必要があります。

編集: 誰かが std::sort が魔法のように並べ替えロジックを逆にしないというコメントを投稿したので、ここに私の返信があります:

そして、なぜですか?std::sortアルゴリズムもコンパレータを取ります!負のブール値を返せば完了です!

于 2013-01-20T05:10:44.357 に答える
1

コンパレータ関数のロジックを逆にします。

inline int rcompare_strs( const void *arg1, const void *arg2 )
{
    return -1*compare_strs(arg1, arg2);
}

inline int rcompare_ints( const void* arg1, const void* arg2 )
{
    return -1*compare_ints(arg1, arg2);
}

qsort( (void *)shrooms, 10, sizeof( shrooms[0] ), rcompare_strs ); 
qsort( (void *)nums, 10, sizeof( nums[0] ), rcompare_ints ); 
于 2013-01-20T05:10:21.563 に答える