代码之家  ›  专栏  ›  技术社区  ›  Eric Auld

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

  •  2
  • Eric Auld  · 技术社区  · 7 年前

    如果我有 std::set::iterator 下一个 集合中的元素?此一般问题的特定用例如下所示:

    假设我有一个 std::set ,我想打印出集合中所有不同的元素对。我相信我不会写这样的东西 my_set.begin() + 1 ,因为 set vector ).那么我怎样才能做到这一点呢?

    我想出的解决办法是

    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;
    }
    

    (1, 4)
    (1, 6)
    (4, 6)
    Program ended with exit code: 0
    

    但我认为,这是一个难题,必须手动迭代器it2,然后检查它是否变为 my_set.end()

    我试着让it2循环看起来像

    for (auto it2 == it; it2!= my_set.end(); it2++) {...
    

    首先 it2 it ,但它对这种语法不满意。

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   ShadowRanger    7 年前
    #包括<迭代器>//对于std::next
    
    设置<int>my_集{1,4,6};
    for(自动it=my_set.begin();it!=my_set.end();++it){
    int first_number=*it;
    库特<&书信电报;“(“<<第一个”<”、“<<第二个”<”)<&书信电报;endl;
    }
    }
    返回0;
    

    请注意,我还将您的 it++ / it2++ 表达式更改为 ++it / ++it2 ;对于迭代器,这对性能很重要,因为后缀增量必然会返回新的迭代器对象,而前缀增量可以更便宜地修改迭代器(只返回对迭代器本身的引用,不需要副本)

    在线试试吧!

    请注意,我还更改了您的 it++ it2++ 表达 ++it ++it2 ; 对于迭代器,这对性能很重要,因为后缀增量必然会返回新的迭代器对象,而前缀增量可以更便宜地修改迭代器(只返回对迭代器本身的引用,不需要副本)。