0

(^)ばかげた理由から、次のシグネチャ ( はApple のC++ への「ブロック」拡張を表す) を持つ関数を書きたいと思います。

extern "C" my_qsort_b(void *arr, size_t nelem, size_t eltsize, int (^)(const void *, const void *));

関数は の観点から実装されstd::sortます。qsort(ブロックポインタではなく関数ポインタを取るため使用できないことに注意してください。また、 qsort_bAppleの標準ライブラリがない可能性があるため使用できませqsort_bん。.

を使用して C++ でこの関数を実装することは可能std::sortですか? または、独自のクイックソートの実装をゼロから作成する必要がありますか?

作業コードを提供してください。悪魔はここの詳細にあります。「どうやって使うstd::sortの?」と聞いているのではありません。

4

3 に答える 3

1

これから始めましょう:

struct memblockref {
  void* location;
  size_t size;
  memblockref( void* loc, size_t s ):location(loc), size(s) {}
  memblockref& operator=( memblockref const& right ) {
    Assert( size == right.size );
    memcpy( location, right.location, std::min( size, right.size ));
    return *this;
  }
private:
  memblockref( memblockref const& ) = delete; // or leave unimplemented in C++03
  memblockref() = delete; // or leave unimplemented in C++03
};

次に、http: //www.boost.org/doc/libs/1_52_0/libs/iterator/doc/iterator_facade.htmlを使用して、メモリバッファーへのmemblockrefのイテレーターを作成します。

次に、ブロックを関数ポインターに変換するか、ラムダまたはファンクターでラップして、を呼び出します。ここで、左右std::sortのフィールドに基づいてブロックベースの比較を呼び出します。locationmemblockref

専門にするswap必要iter_swapがあるかもしれませんが、そうではないかもしれません。

于 2013-01-02T01:11:33.987 に答える
1

を使用するstd::sortには、イテレータ クラスと、ファンクタ オブジェクトでブロックをラップするクラスを作成する必要があります。自分でクイックソートを実装することは、より短い代替手段のように思えます。

ところで: ブロックは void ではなく bool を返す必要がありますよね?

于 2013-01-02T00:27:17.050 に答える