简化函数以检查C 中的`sTD :: set`中是否存在特定值
Simplifying a function to check if a specific value exists in a `std::set` in C++
我已经在C 中写了一个函数,以检查std::set
中是否存在特定值。这是功能:
bool check_if_any(set<int> &s, int x)
{
for (int i : s)
if (i == x)
return true;
return false;
}
我熟悉c#中的linq,其中相同的功能可以更简洁地写入:
bool CheckIfAny(Set<int> s, int x)
{
return s.Any(i => i == x);
}
我想简化C 功能,以便与C#版本一样短。
任何人都可以告诉我如何使用该语言提供的内容来重构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());
}
这样,您可以制作自己的lambda功能来寻找特定的参数,而不仅仅是使用默认的可比性。请注意,第二个选项将较慢(线性),因为它必须通过容器中的每个对象,并且不使用像BST或Hashmaps这样的容器。
相关文章:
- std::set 是否将对象连续存储在内存中?
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- STD :: SET(或STD :: MAP)是否有一个提供基于值的查找的STL比较器?STD :: lands_les
- 模板化的使用是否为具有自定义键的unordered_map/set创建了一个良好的模式
- 是否有为std::set请求容量的函数
- 简化函数以检查C 中的`sTD :: set`中是否存在特定值
- 在C++中编写简单的 get/set 方法时,是否应始终使用 const 引用作为参数
- 在 std::set 中使用运算符 != 作为运算符<是否安全?
- std::set::迭代器和std::set::const_iterator之间是否存在操作差异
- 在C++中定义虚拟get和set函数是否被认为是一种好的做法
- map/set :: 插入是否提供了正确的迭代器提示,它的复杂性是多少?
- 是否有任何std::set实现不使用红黑树
- 是否可以使用与 std::set 中包含的不同类型的元素来执行搜索和删除
- std::set迭代顺序是否始终根据C++规范升序
- 我怎样才能指向 std::set 的成员,以便我可以判断该元素是否已被删除
- std::set_difference是否可以比较set和map键
- 是否可以更改c++ std::set的比较器?
- 是否可以从std::set中删除修改过的元素?
- std::<classtype>set.find(element) 是否使用类中的 == 运算符来比较元素?