如何迭代unordered_set内的无序对

How to iterate on unordered pairs inside an unordered_set?

本文关键字:set 无序 unordered 何迭代 迭代      更新时间:2023-10-16

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和赋值运算符来使其更通用。标准库算法倾向于这样做。如果我为图书馆写这篇文章,我可能也会这样做。