Могу ли я использовать std :: find () с лямбда-функцией в vc ++ [VS 2019]? - PullRequest
0 голосов
/ 21 января 2020
  • ОС : Windows 10 Pro 64-разрядная (10.0, сборка 18362)
  • IDE : Visual Studio 2019 (версия 16.4.3 ) [ До этого я использовал VS 2010 ]
  • Язык : c ++ и VC ++

Вот мой простой код, в котором я просто хочу найти элемент 3 и распечатать его, если он найден

    std::vector<int> intVect;

    for (int counter = 0; counter < 5; counter++)
    {
        intVect.push_back(counter);
    }

    std::find(intVect.begin(), intVect.end(), [](int a)
        {
            if (a == 3)
            {
                std::cout << "Item Found.." << std::endl;
            }
        });

Проблема в том, что когда я компилирую этот код, он выдает ошибку, как показано ниже:

Ошибка C2678 бинарный '==': не найден оператор, который принимает левый операнд типа 'int' (или нет приемлемого преобразования) c: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ include \ алгоритм 41

Ответы [ 2 ]

3 голосов
/ 21 января 2020

std::find ожидает, что значение будет сравниваться с элементами, поэтому оно должно быть

if (std::find(intVect.begin(), intVect.end(), 3) != intVect.end())
{
    std::cout << "Item Found.." << std::endl;
}

Если вы хотите использовать лямбду в качестве предиката, вы должны использовать std::find_if ; обратите внимание, что лямбда должна вернуть bool.

if (std::find_if(intVect.begin(), intVect.end(), [](int a) { return (a == 3); }) != intVect.end())
{
    std::cout << "Item Found.." << std::endl;
}
3 голосов
/ 21 января 2020

Вы можете сделать это легко без лямбды:

auto val = std::find(intVect.begin(), intVect.end(), 3);
if (val != intVect.end()) {
   std::cout << "Value found\n";
}

Тем не менее, также можно использовать лямбду, но вам нужно использовать std::find_if (доступно в том же заголовок как std::find: <algorithm>):

auto val = std::find_if(intVect.begin(), intVect.end(), [](int i) { return i == 3; });
if (val != intVect.end()) {
   std::cout << "Value found\n";
}

Но в этом нет никакого смысла. В этом случае вы будете использовать find_if только в том случае, если у вас есть что-то более сложное, например struct, и вы искали определенного члена:

struct complex {
   int id;
   ...
};
std::vector<complex> things = ...;
auto val = std::find_if(things.begin(), things.end(), [](const complex& c) { return c.id == 3; });
if (val != things.end()) {
    std::cout << "Value found\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...