如何使用std :: replace_if()的lambda函数?

时间:2017-11-08 23:10:36

标签: c++ lambda replace

我正在尝试编写一个函数,如果ID匹配,它将替换集合中的Song。

我仍然对lambda表达式感到困惑。

我正在尝试使用replace_if,但我不确定如何在表达式中引用原始歌曲。

m_songs是一组歌曲对象

我想用m_song中的任何一首歌代替用newSong分享ID。

所以基本上如何在replace if语句中从m_songs中获取id?

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

2 个答案:

答案 0 :(得分: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(); }

lambda函数通过引用捕获newSong并且能够在lambda中使用它,现在你需要做的就是检查lambda被调用的每首歌的id。

replace_if方法用歌曲集合中的每首歌调用lambda函数,因此你不需要再次遍历方法中的所有歌曲

答案 1 :(得分:1)

这里有一个C ++ 17 replace_if和lambda示例。

#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