2017-11-08 4 views
0

ID가 일치하면 세트의 노래를 대체 할 함수를 작성하려고합니다.std :: replace_if()에서 람다 함수를 사용하는 방법?

나는 아직도 람다 식으로 약간 혼란 스럽다.

replace_if를 사용하려고하는데 표현식에서 원본 노래를 참조하는 방법을 모르겠습니다.

m_songs 노래의 집합 내가 newSong와 m_song 주에 중 노래 ID로 교체 할

객체입니다.

그래서 기본적으로 replace if 문에서 m_songs의 ID를 어떻게 가져 옵니까?

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를 캡처하고 내에 사용할 수있다 람다, 지금 당신이해야 할 일은 람다가 호출 된 각 노래에 대해 이드를 확인하는 것뿐입니다.

replace_if 방법은 노래의 컬렉션에있는 각 노래와 람다 함수를 호출, 그래서 당신은 방법에있는 모든 노래를 반복 할 필요가 없습니다 다시 여기

+1

'newSong.getID()'를 직접 캡처하는 것이 더 좋지 않을까요? 아마도'getID'가보기보다 비싸지 않는 한 아마 많은 이슈가 없을 것입니다. –

+0

좋아, 나는 그것을 (노래 const & 노래) tho해야한다고 생각. –

+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