2016-10-05 13 views
-1

私は定期的な比較クラスまたは関数を渡してset :: set <>にする方法を知っています。std :: set比較関数のカスタム引数

私はいくつかのテストコードを書いており、STLのstd :: setを使っていくつかのCライブラリをエミュレートしたいと思います。比較オブジェクトにCコールバックを渡して別の比較が行われるようにします。

私は、次の理論のコードがあります。その後、

std::set<MyClass, MyComparison> m1; 

しかし、私は、何とか、MyComparisonオブジェクトをインスタンス化することはできません、 "CMP" を渡すと:

struct MyClass 
{ 
    int a; 
}; 

typedef bool (*user_callback_t)(void *, void *); 
class MyComparison 
{ 
private: 
    user_callback_t cb = nullptr; 
public: 
    MyComparison(user_callback_t cb): cb(cb) { } 
    MyComparison() {} 
    bool operator()(const MyClass &a, const MyClass &b) const 
    { 
     return cb((void *)&a, (void *)&b); 
    } 
}; 

int f1() 
{ 
    auto cmp = [](void *a, void *b) -> bool 
    { 
     return *(int *)a < *(int *)b; 
    }; 

    MyComparison mycmp(cmp); 

    std::set<MyClass, MyComparison> m1; 

    m1.insert({ 1 }); 
    m1.insert({ 2 }); 
    m1.insert({ 3 }); 

    return 0; 
}; 

は、今私が行うことができますどのように通知をその特定のセットで比較オブジェクトを初期化することを使用してください。

これを達成する方法はありますか?

+0

なぜあなたはできませんか? Btw、あなたは 'MyClass'のコンテナを持っているときに整数を比較しています。それがUBです。 – krzaq

+0

@krzaq http://stackoverflow.com/questions/7160901/why-is-c11s-pod-standard-layout-definition-the-way-it-isの最初の回答を参照してください。しかし、はい、なぜあなたはできませんか? – immibis

+1

おそらく[いくつかのドキュメントを読む](http://en.cppreference.com/w/cpp/container/set/set)。 – juanchopanza

答えて

1

MyComparisonインスタンスをstd::setに渡すことができないというあなたの主張は間違っています。 (C++ 11に)ちょうどそれを期待しstd::setのコンストラクタがあります:

explicit set(const Compare& comp = Compare(), 
       const Allocator& alloc = Allocator()); 

だからあなたMyComparisonは、最初の引数として渡すことができます。

std::set<MyClass, MyComparison> m1(mycmp); 

あなたがC++ 11以降利用できていない場合は、このコンストラクタのオーバーロードが存在しないで、あなたは別のものを使用する必要があります。

template< class InputIt > 
set(InputIt first, InputIt last, 
    const Compare& comp = Compare(), 
    const Allocator& alloc = Allocator()); 

この1つはしかしinteratorを期待最初の2つの引数の範囲。実際には範囲から構築したくないので、それらはダミーである必要があります。

std::vector<int> dummy; 
std::set<MyClass, MyComparison> m1(dummy.begin(), dummy.end(), mycomp); 

dummyが後で使用されることはありません:あなたはいろいろ書いように行うことができます。ダミーのイテレータクラスを実装する以外にも、より良い解決策があるかどうかはわかりません。

std::setのコンストラクタの詳細については、http://en.cppreference.com/w/cpp/container/set/setを参照してください。

関連する問題