声明迭代器的正确方法是什么?

What is the correct way of declaring an iterator?

我想知道使用

是否有任何区别
std::set<int,std::greater<int>>::iterator itr;

std::set<int>::iterator itr;

我在下面的代码中尝试了其中的两个,结果是一样的,我想知道一个和另一个之间有什么区别,或者是否有任何情况我应该需要使用一个在另一个之上(当使用 STL 库或其他情况时)。

代码:

#include<iostream>
#include<iterator>
#include<set>

int main(){
    std::set<int,std::greater<int>> s1;
    s1.insert(40);
    s1.insert(30);
    s1.insert(60);
    s1.insert(20);
    s1.insert(50);
    s1.insert(10);
    // std::set<int>::iterator itr;
    std::set<int,std::greater<int>>::iterator itr;
    std::cout<<"\nThe set s1 is: \n";
    for(itr=s1.begin();itr!=s1.end();itr++){
        std::cout<<*itr<<" ";
    }
    std::cout<<"\n";
}

std::set<int>::iterator itr; 错误。

默认情况下,它恰好适用于 GCC、Clang 和 MSVC。 但是例如如果我启用 GCC 的迭代器调试 (-D_GLIBCXX_DEBUG),它会停止编译。

通常您不需要手动拼写迭代器类型。你可以做到 for (auto itr = s1.begin(); ...)。或者,如果需要创建未初始化的迭代器,decltype(s1)::iterator itr;.