如何迭代unordered_set内的无序对
How to iterate on unordered pairs inside an unordered_set?
在
unordered_set
中迭代无序元素对的简洁方法是什么?
(所以顺序无关紧要,元素应该不同)
例如 {1, 2, 3} => (1, 2) (2, 3)(1, 3)
我最初的尝试是这样的
for (i = 0; i < size - 1; i++) {
for (j = i + 1; j < size; j++) {
...
}
}
但是对于迭代器来说,这并不是非常方便。
这应该有效,给定一个std::unordered_set
s
:
auto set_end = s.end();
for (auto ai = s.begin(); ai != set_end; ++ai) {
for (auto bi = std::next(ai); bi != set_end; ++bi) {
// *ai, *bi
}
}
这基本上是以下整数的迭代器等效项:
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
// i, j
}
}
这是半通用形式的orlp解决方案。
template<typename ForwardIterator, typename DestItr>
auto cartesian_product(ForwardIterator b, ForwardIterator e, DestItr d) -> DestItr {
using std::next;
using std::for_each;
for (; b != e; ++b) {
for_each(next(b), e, [&](auto right){
*d++ = std::make_tuple(*b, right);
});
}
return d;
}
template<typename ForwardRange, typename DestItr>
auto cartesian_product(ForwardRange r, DestItr d) -> DestItr {
using std::begin;
using std::end;
return cartesian_product(begin(r), end(r), d);
}
住在科利鲁。
当然,您可以通过使用重载来使用自定义函子而不是make_tuple
和赋值运算符来使其更通用。标准库算法倾向于这样做。如果我为图书馆写这篇文章,我可能也会这样做。
相关文章:
- 为什么我无法更改"set<set>"循环中的值<int>
- 递归无序映射
- 对于set上的循环-获取next元素迭代器
- c++找不到具有相同哈希的无序集合元素
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 如何使用set实现无序数据结构?
- 如何写向量的无序向量集,即unordered_set<向量<向量<int>>集合?
- 如何禁用 CPU 的无序执行
- 使用运算符调用 void 函数时出错<set>
- 修改"std::set"中用户定义类型的值
- 生成提升::hana::set 的常量表达式问题
- 如何在构造函数参数中初始化"std::set"?
- 从C++无序集合中高效提取元素
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 相当于 python 的 set.pop() 用于C++的无序集合