Проверка наличия элемента в списке, используя 2 параметра и лямбда-функцию в C ++ - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь проверить наличие 8 в списке 1,2,3,4,5, используя any_of

  list<int> mylist{ 1,2,3,4,5 };
  int arg = 8;
  bool is_present = any_of(mylist.begin(), mylist.end(), [&arg,&elt](auto& arg,auto& elt) {return arg == elt; });
  cout << "Is 8 present? " << is_present << endl;

Но я получаю ошибку в лямбда-функции. Когда я пытаюсь это организовать, выдает различные ошибки, такие как

In lambda function ‘elt’ is not captured или lambda parameter ‘arg’ previously declared as a capture, и т. Д. c.

Как правильно настроить лямбда-функцию? Обратите внимание, что я должен решить это, используя 2 параметра и лямбда-функцию.

Ответы [ 5 ]

2 голосов
/ 02 мая 2020

std::any_of 3-й параметр - унарный предикат , что означает, что лямбда может получить только один аргумент, который будет элементом списка в текущей итерации.

Кроме того, вам нужно захватить переменную arg, чтобы использовать ее для сравнения внутри лямбда-выражения. Оба захвата по ссылке:

  • [arg](...) {...} захватывает только arg переменная по значению
  • [=](...) {...} захватывает все переменные в текущей области по значению

и захват по значению:

  • [&arg](...) {...} захватывает только переменную arg по ссылке
  • [&](...) {...} захватывает все переменные в текущей области по ссылке

выполнит эту работу.

В конечном итоге будет работать следующее:

bool is_present = std::any_of(
    mylist.begin(), mylist.end(),
    [arg] (auto el) {
        return arg == el;
    }
);
2 голосов
/ 02 мая 2020

Вы используете arg и elt как для захвата, так и для параметров лямбды, а лямда внутри any_of аргумента лямбды подразумевает ссылку на содержимое контейнера, поэтому вам нужно изменить лямбду следующим образом:

    bool is_present = std::any_of(mylist.begin(), mylist.end(), [&arg](int& elt) {return arg == elt; });
2 голосов
/ 02 мая 2020

Вы не можете решить это с двумя параметрами (если вы имеете в виду два параметра для вашей лямбда-функции). Лямбда-функция, используемая в any_of, должна принимать один параметр по определению .

Вот как это сделать

bool is_present = any_of(mylist.begin(), mylist.end(), [=](auto elt){ return arg == elt; });
2 голосов
/ 02 мая 2020
[&arg,&elt](auto& arg,auto& elt)

Во-первых, в окружающей области действия нет elt для захвата. Во-вторых, предикат, переданный any_of, должен принимать один аргумент. В-третьих, параметр будет затенять захват одного и того же имени.

[&arg](auto& elt)

должен добиться цели.

2 голосов
/ 02 мая 2020

Это должно быть

// capture arg, and check every element (elt) equals to arg or not
bool is_present = any_of(mylist.begin(), mylist.end(), [arg](auto elt) {return arg == elt; });

LIVE

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...