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

par*_*214 1 c++ iterator

我想知道使用之间是否有什么区别

std::set<int,std::greater<int>>::iterator itr;
Run Code Online (Sandbox Code Playgroud)

和

std::set<int>::iterator itr;
Run Code Online (Sandbox Code Playgroud)

我在下面的代码中尝试了其中的两个,结果是相同的,我想知道其中一个和另一个之间有什么区别,或者是否有任何实例需要使用其中一个而不是另一个(当使用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";
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 7

std::set<int>::iterator itr;是错的。

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

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

  • 或者更好的是,只需使用 [基于范围的循环](https://en.cppreference.com/w/cpp/language/range-for) 而不是直接处理迭代器,例如: `for(int值:s1)` (2认同)