我正在尝试编写一个函数,如果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) ;
答案 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