2016-12-09 5 views
2

Stroustrup氏変換動作中のベクトル要素に機能を実行するためにオーバーロードoperator()の使用例与える:ラムダ式とSTLアルゴリズムを組み合わせたファンクタを使用していますか?

:に比べて、上記のコードは非常に冗長と思わ式

class Example 
{ 
    public: 
    std::vector<int> Test1 {1,2,3,4,5}; 
    std::vector<int> Test2; 
    int operator()(int el); 
    void MyFunction(); 
} 

int Example::operator()(int el) 
{ 
    return el + 1; 
} 

void Example::MyFunction() 
{ 
std::transform(Test1.begin(), Test1.end(), std::back_inserter(Test2), std::bind(Example(), std::placeholders::_1)) 
} 

しかし、ラムダの導入とを

std::transform(Test1.begin(), Test1.end(), std::back_inserter(Test2), [](int el){return el + 1;}); 

私は、オーバーロードされたoperator()アプローチを使用することにほとんど価値がないと言っていますか?または、STLアルゴリズムを使用するときに有益なシナリオがまだありますか?

+0

タイトルは一般的です - 演算子のオーバーロードですが、実際は演算子()のオーバーロード、さらに正確にはファンクタの使用を意味します。私は質問を編集します。 – SergeyA

+1

最初の例で 'std :: bind'を使っているのはなぜですか? – Deduplicator

答えて

2

はい、あなたは正しいです。

ラムダ式は、基本的に無名ファンクタを作成します。これは、プログラマがコードを少なくするだけです。 C++ 11より前の標準アルゴリズムは、プログラマーが(あなたのように)いくつかの特定の動作のためにまったく新しいクラスを設定する必要があるファンクタでのみ機能します。

これは、ラムダがC++ 11に導入された理由で、カスタム関数を使用して標準アルゴリズムを使用することが、もはや書き込みに苦労しないようにするためです。

0

Gill Batesが言及しているとおり、ラムダ式は名前のないファンクタを作成します。しかし、コードを読みにくくする可能性もあります。私は、共同プロジェクトでは、何かが何度も使用されている場合、特に複雑なことが起こっている場合に、オペレータに過負荷をかけることがしばしば明らかになっています。

注意しておいて、ラムダは控えめに使うと良いです。非常に重要で、オブジェクトでよく使用される機能については、オーバーロードされたオペレータにそのようなすべての対話をカプセル化することができます。

関連する問題