C++ 给定一个std::set::iterator,获取一个指向下一个元素的迭代器

C++ 给定一个std::set::iterator,获取一个指向下一个元素的迭代器,c++,iterator,C++,Iterator,如果我有一个std::set::iterator,如何快速生成一个指向集合中下一个元素的迭代器?此一般问题的特定用例如下所示: 假设我有一个std::set,我想打印出集合中所有不同元素对。我相信我不能写像我的_set.begin+1这样的东西,因为set生成的迭代器不能像向量生成的迭代器那样进行算术运算。那么我如何才能做到这一点呢 我想出的解决办法是 int main(){ set<int> my_set {1,4,6}; for (auto it = my_set

如果我有一个std::set::iterator,如何快速生成一个指向集合中下一个元素的迭代器?此一般问题的特定用例如下所示:

假设我有一个std::set,我想打印出集合中所有不同元素对。我相信我不能写像我的_set.begin+1这样的东西,因为set生成的迭代器不能像向量生成的迭代器那样进行算术运算。那么我如何才能做到这一点呢

我想出的解决办法是

int main(){
    set<int> my_set {1,4,6};
    for (auto it = my_set.begin(); it != my_set.end(); it++) {
        int first_number = *it;
        for (auto it2 = it; it2!= my_set.end(); it2++) {
            if (it2 == it){it2++;} // I don't want the second number to be equal to the first
            if (it2 == my_set.end()) {break;} //If I don't put this in, it will eventually try to access my_set.end(), giving bad behavior. 
            int second_number = *it2;
            cout << "(" << first_number << ", " << second_number << ")" << endl;
        }
    }
    return 0;
}
但我认为这是一个难题,必须手动迭代it2,然后检查它是否没有成为我的_set.end。我怎样才能做得更好

我试着让it2循环看起来像

for (auto it2 == it; it2!= my_set.end(); it2++) {...
让它从比它大一点的it2开始,但它对这种语法不满意

如果这个问题以前出现过,我表示歉意。我找不到它。

可用于在一次调用中获得相对于现有迭代器的高级新迭代器。如果第二个参数未传递,则它仅高级一次,因此您的代码应该只需要:

#include <iterator>  // For std::next

int main(){
    set<int> my_set {1,4,6};
    for (auto it = my_set.begin(); it != my_set.end(); ++it) {
        int first_number = *it;
        for (auto it2 = std::next(it); it2 != my_set.end(); ++it2) {
            int second_number = *it2;
            cout << "(" << first_number << ", " << second_number << ")" << endl;
        }
    }
    return 0;
}

注意,我还将您的it++/it2++表达式更改为++it/++it2;对于迭代器来说,这对性能很重要,因为后缀增量必然会返回新的迭代器对象,而前缀增量可以修改迭代器,只返回对迭代器本身的引用,而不需要副本。因为您不希望打印与其自身对相同的数字,在内部for循环中,唯一应该做的事情就是比较两个迭代器,如果它们是相同的,则继续进行,这似乎不符合逻辑吗?这是唯一不应该打印的内部循环和外部循环的迭代值的组合。@SamVarshavchik是的,这是有意义的。
#include <iterator>  // For std::next

int main(){
    set<int> my_set {1,4,6};
    for (auto it = my_set.begin(); it != my_set.end(); ++it) {
        int first_number = *it;
        for (auto it2 = std::next(it); it2 != my_set.end(); ++it2) {
            int second_number = *it2;
            cout << "(" << first_number << ", " << second_number << ")" << endl;
        }
    }
    return 0;
}