【发布时间】: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。
【问题讨论】: