代码之家  ›  专栏  ›  技术社区  ›  Ely

set2.begin()返回的迭代器类型

  •  1
  • Ely  · 技术社区  · 6 年前

    在一个问答题中,我认为下面的程序不会编译,因为我希望迭代器类型是 set<int>::iterator 而不是 set<int, int>::iterator .

    我可以在C++ 98、C++ 11和C++ 14中成功地编译下面的程序并打印结果 9 5 4 3 2 1 0 0, 1, 2, 3, 4, 5, 9, . 看来程序是正确的。

    为什么迭代器类型 设置<int,int>::迭代器 可以接受吗?

    #include <iostream>
    #include <set>
    #include <vector>
    #include <functional>
    using namespace std;
    
    int main(){
            int mynumbers[] =        { 3, 9, 0, 2, 1, 4, 5 };
            vector<int>        v(mynumbers, mynumbers+7);
            set<int> set1(v.begin(),v.end());
            set<int, greater<int> > set2(v.begin(), v.end());
    
            // 
            // The following iterator type compiles. Why is that so ?
            // 
            for(set<int, int>::iterator i=set2.begin();i!= set2.end(); i++)
                    cout<<*i<<" ";
    
            for(set<int>::iterator i=set1.begin();i!= set1.end(); i++)
                    cout<<*i<<", ";
            cout<<endl;
            return 0;
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Baum mit Augen    6 年前

    为什么迭代器类型 set<int, int>::iterator 可以接受吗?

    不是这样。 int 不是比较器。你违反了标准的要求。程序格式不正确。

    Some compilers 更严格地检查这些要求。


    供参考:正确的类型是 set<int, greater<int> >::iterator 或用于C++ 11和以后的 auto . set<int>::iterator 也会错的。