2017-11-08 6 views
0

IDが一致する場合、セット内のソングを置き換える関数を記述しようとしています。std :: replace_if()でラムダ関数を使用するには?

私はまだラムダ式で混乱しています。

私はreplace_ifを使用しようとしていますが、表現の元の曲を参照する方法がわかりません。

m_songsは、曲のセットが、私はNEWSONGとm_song株式でどの曲IDで置き換えたい

オブジェクトです。

これは基本的にどのように置き換えif文でm_songsからidsを取得するのですか?

std::replace_if(m_songs.begin(), m_songs.end(), 
    newSong.getID() == (One of the m_songs?)getID() , newSong) ; 
+0

@ user0042でそれをコンパイル。 –

+1

http://en.cppreference.com/w/cpp/language/lambda –

+1

ここに十分なコードはありませんが、ここではラムダは必要ないと思いますが、古い値です。 –

答えて

1
Song newSong = ...; 
std::replace_if(std::begin(m_songs), std::end(m_songs), [&newSong](const &Song song) { 
    return newSong.getID() == song.getID(); 
}, newSong); 

また、単に(と仮定すると、IDが文字列である)、この構文を使用してIDをキャプチャすることができます

[std::string id = std::move(newSong.getID()](const &Song song) { return id == song.getID(); } 

ラムダ関数は、参照することによりnewSongをキャプチャし、内部にそれを使用することができますラムダ、今あなたがする必要があるのは、ラムダが呼び出された各曲に対してIDをチェックすることだけです。

replace_if方法は、曲のコレクション内の各曲にラムダ関数を呼び出して、あなたはメソッド内のすべての曲を反復処理する必要はありません再び

+1

'newSong.getID()'を直接捕捉する方が良いのではないでしょうか?おそらく 'getID'が見た目よりも高価なものでなければ、あまり問題にならないでしょう。 –

+0

私はそれを得る、私はそれが(歌のconst&歌)のはずだと思うね。 –

+0

@MichaelGrinnell、それも動作します – smac89

1

ここでラムダとC++ 17 replace_ifですあなたのための例。

#include <algorithm> 
#include <vector> 
#include <iostream> 

using namespace std; 

int main() { 
    vector<int> v{1,2,3,4,8,100}; 
    int match = 4; 
    replace_if(v.begin(), v.end(), [&](auto x){return x == match;}, 9999); 
    for(auto x: v) { 
     cout << x << ' '; 
    } 
    cout << endl; 
    return 0; 
} 

私ははい、私はランバダの機能を理解するために苦労しています

g++ -Wall -W -pedantic -g -std=c++17 replace-if-test.cpp -o replace-if-test 
関連する問題