2016-10-19 5 views
1

こんにちは、ありがとうございました!関数のオーバーロードを呼び出すstruct operator /()は何を引数にしますか?

std::vectorからstd::uniqueeraseを使用しています。一意性をチェックするために、私は構造体のブール関数を呼び出しています。あらかじめ定義された公差を使用したいので、目的の値が渡されるコンストラクタを追加しようとしました。それはうまくいきますが、私はなぜその理由が分かりません。

std::vector<std::pair<int,double> > myVec; 

struct Check{ 

    double tol_ = 0.0; 
    Check(double tol) : tol_(tol) 
    {   
    } 

    bool operator()(const std::pair<int,double> &a, 
        const std::pair<int,double> &b) 
    { 
    return fabs(a.second-b.second) < tol_; 
    } 
}; 

// fill vector 
... 

// remove duplicates 
myVec.erase(std::unique(myVec.begin(), myVec.end(), Check(0.1)), myVec.end()); 

これはやや妥当な方法ですか?私はuniqueについて混乱しています。この機能に達すると、構造体Checkが公差を使用して構築されます。 次へuniqueは、この構造体をもう一度呼び出してベクトル要素を参照として渡して比較します。

ありがとうございました!

+0

は、なぜあなたは 'myVec->()'の代わりに 'myVec.beginを()'始めていますか? – PRP

+1

まず、['std :: unique'](http://en.cppreference.com/w/cpp/algorithm/unique)は重複する*連続する要素を削除します。つまり、範囲をソートする必要があります。第二に、 'myVec'はポインタではないようですが、矢印メンバーアクセス演算子を使うのは間違っています。最後に、*どのように動作しませんか?あなたは詳細を教えていただけますか? –

+0

本当にご質問ありますか?私は「はい」と答えることしかできないということです。これは合理的な練習であり、そのように行われます。だからあなたはこれがどのように機能するか正しいです。 – Hayt

答えて

2

std::uniqueの呼び出しでCheck(0.1)を呼び出すと、一時オブジェクトが作成されるということが起こります。この一時的なオブジェクトは、完全な式の終わりまでの存続期間を持ちます。

一時オブジェクトは、他のオブジェクトと同様に、std::unique関数に渡されます。これは、その引数がテンプレート引数であり、その使用法に一致する任意の型を持つことができるためです。

要するにstd::uniqueへの呼び出しは、このようなものとほぼ同等です:

// Enter new nested local scope 
{ 
    Check temporary_object(0.1); // Create object 
    std::unique(..., temporary_object); 
} 
// Left nested scope, the `temporary_object` is destructed 
+0

説明をありがとう! 一時的なオブジェクト( 'std :: unique(...、temporary_object);'と書いたもの)を作成した後、一意の関数は一時オブジェクトを 'temporary_object(&a、&b) 'bool operator()(...)によってオーバーロードされました。 – AnBr

+0

@AnBrはい、正しいです。 –

関連する問題