Магия в C ++, вдохновленная C # LINQ

Можно ли сократить этот метод …

bool check_if_any(set<int> &s, int x)
{
for (int i : s)
if (i == x)
return true;
return false;
}

…так что похоже на путь C # LINQ …

bool check_if_any(set<int> &s, int x)
{
return s.any(i => i == x);
}

…или может быть как-то иначе, но короче? Я не знаю лямбды в C ++, но я знаю, что они существуют. Так что я думаю, что это возможно.

-4

Решение

В общем, чтобы выяснить, можно ли использовать предикат любого из элементов в коллекции

bool check_if_any(set<int> &s, int x)
{
return std::any_of(s.begin(), s.end(), [&](int v){ return v==x;});
}

но в этом случае

return s.find(x) != s.end();

будет лучше как по скорости, так и по четкости.

3

Другие решения

Чтобы найти именно это значение, вы можете написать что-то вроде этого:

bool check_if_any(const std::set<int>& mySet, int x) {
return mySet.find(x) != mySet.end();
}

или если вы хотите, чтобы это выглядело еще ближе к C # и, возможно, захотите использовать свой собственный компаратор, используйте C ++ 11 lambda и std::find_if() метод:

bool check_if_any(const std::set<int>& mySet, int x) {
return (std::find_if(
mySet.begin(), mySet.end(),
[](int y) { return x == y; }
) != mySet.end());
}

таким образом, вы можете сделать свою собственную лямбда-функцию для поиска конкретного аргумента, а не просто использовать сопоставимые значения по умолчанию. Обратите внимание, что второй вариант будет медленнее (линейный), поскольку он должен проходить через каждый объект в контейнере и не использует контейнеры persk, такие как BST или hashmaps.

0

По вопросам рекламы [email protected]