std::set_intersection用于已排序的范围,[_]用于未排序的范围/容器
std::set_intersection is for sorted ranges as [ _ ] is for unsorted ranges/containers
std::set_intersection
采用排序的元素范围(好吧,迭代器对)。但假设我有未排序的数据,例如两个std::unordered_set
。有标准的设施来交叉它们吗?
我不知道C++11中有这样的函数。答案是"不"。
在这种情况下没有快捷方式。您应该检查较小集合中的每个元素在较大集合中的成员身份,如果找到了,则将其插入到输出集合中。由于unordered_set是使用带有bucket的散列来实现的,因此查找时间应该很短(具有良好的散列函数和合理的散列最大加载量)。您应该能够在较小的集合上编写对for_each的调用,该调用对较大的集合执行检查并插入到输出集合中,而不会变得太难看。
如果要在两个原始集合中的一个集合中就地构建交点,可以检查其每个元素是否在另一个集合,如果不在,则删除该元素。这可以用remove_if在将保存结果的unordered_set上写入。
另一种选择是将copy_if与插入迭代器一起使用。在同一时间和空间内有很多选择。选择一个似乎是为了清晰而优化的。
据我所知,没有一个固定的库函数只为你做这件事。
相关文章:
- 并行用于C++17中数组索引范围内的循环
- 范围修剪视图实现不适用于反向视图
- C++11 基于范围的 for 循环,用于 std::list
- 使用范围用于向量的循环时,CppCorechecker C风格警告
- 基于范围的 for 循环,用于包含C++中的指针的自定义链表,仅返回对象
- 唯一/共享 ptr 用于在数组超出范围后自动删除阵列
- 为什么类型特征不适用于命名空间范围内的类型?
- 是否存在用于按以下方式对两个范围进行排序和分区的标准算法?
- 代码具有特定于函数的变量,用于更改范围之外的值
- 用于查找范围重叠的更节省内存的算法
- 用于基元类型的基于范围的
- 将C 17支持基于较简单的范围用于循环
- 使用基于自动的范围用于循环VS,使用对循环范围的基于对的范围
- 条件语句,用于验证事务模块(.cpp)标头中#define(d)整数提供的范围
- 提升范围不适用于 C++1y 初始化捕获可变 lambda
- 基于自定义范围的迭代器,用于矢量的模板向量
- 用于循环范围范围
- 用于处理超出范围错误的异常类 - C++
- 嵌套c++11范围循环,用于查找组合
- 如何将的范围用于传递给函数的数组