Вопрос:

Как использовать лямбда-функцию с std :: replace_if ()?

c++ lambda replace

1056 просмотра

2 ответа

406 Репутация автора

Я пытаюсь написать функцию, которая заменит песню в наборе, если идентификаторы совпадают.

Я все еще немного смущен лямбда-выражениями.

Я пытаюсь использовать replace_if, но я не уверен, как ссылаться на оригинальную песню в выражении.

m_songs - это набор объектов песни

Я хочу заменить на любую песню в m_song, которая делит ID с newSong.

В общем, как мне получить идентификаторы из m_songs в операторе замены if?

std::replace_if(m_songs.begin(), m_songs.end(),
     newSong.getID() == (One of the m_songs?)getID() , newSong) ;
Автор: Michael Grinnell Источник Размещён: 08.11.2017 11:10

Ответы (2)


2 плюса

14914 Репутация автора

Решение
Song newSong = ...;
std::replace_if(std::begin(m_songs), std::end(m_songs), [&newSong](const &Song song) {
    return newSong.getID() == song.getID();
}, newSong);

Вы также можете просто захватить идентификатор, используя этот синтаксис (при условии, что id является строкой):

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

Лямбда-функция захватывает newSongпо ссылке и может использовать ее в лямбда-выражении. Теперь все, что вам нужно сделать, это проверить идентификатор каждой песни, с которой вызывается лямбда.

replace_ifМетод вызывает функцию лямбды с каждой песней в коллекции песен, так что вам не нужно перебирать все песни в методе снова

Автор: smac89 Размещён: 08.11.2017 11:21

1 плюс

42660 Репутация автора

Вот вам 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
Автор: Zan Lynx Размещён: 08.11.2017 11:34
Вопросы из категории :
32x32