Можно ли сократить этот метод …
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 ++, но я знаю, что они существуют. Так что я думаю, что это возможно.
В общем, чтобы выяснить, можно ли использовать предикат любого из элементов в коллекции
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();
будет лучше как по скорости, так и по четкости.
Чтобы найти именно это значение, вы можете написать что-то вроде этого:
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.