【问题标题】:std::set iterating over all pairs [duplicate]std::set 迭代所有对[重复]
【发布时间】:2021-12-25 09:19:54
【问题描述】:

考虑code snippet 1

#include <set>
#include <cstdio>

int main() {
    std::set<int> intset = {1, 2, 3, 4, 5, 6};
    for(std::set<int>::iterator it1 = intset.begin(); it1 != intset.end(); it1++)
      for(std::set<int>::iterator it2 = it1 + 1; it2 != intset.end(); it2++)
            printf("Pair {%d,%d}\n", *it1, *it2);
}

这不会编译。见here

然而,我看不出这种遍历所有对的方式与the accepted answer 和问题here 有何不同。

从那里接受的答案转述,考虑code snippet 2

for (auto it1 = intset.begin(); it1 != intset.end(); ++it1) {
  for (auto it2 = it1; ++it2 != intset.end(); /**/) {
     printf("Pair {%d,%d}\n", *it1, *it2);
  }
}

我已经验证了上面的代码确实可以正常工作。但是,code snippet 1 无法编译,而上面的 code snippet 2 可以编译的根本原因是什么?

在这两种情况下,我们不只是递增一个集合迭代器吗?在一种情况下,我们正在做it2 = it1 + 1,而在另一种情况下,我们正在做++it2

【问题讨论】:

    标签: c++ stl stdset


    【解决方案1】:

    it1 + 1是随机访问操作,所以它要求迭代器是随机访问迭代器,由于std::set&lt;int&gt;::iterator不是随机访问迭代器,所以不支持这种操作。

    ++it2要求迭代器是前向迭代器,由于std::set&lt;int&gt;::iterator是双向迭代器,所以它是前向迭代器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      • 2015-05-21
      相关资源
      最近更新 更多