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

Iterator type returned by set2.begin()

本文关键字:迭代器 类型 返回 set2 begin      更新时间:2023-10-16

在一个测验问题中,我认为以下程序不会编译,因为我期望迭代器类型为 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,。看来该程序是正确的。

为什么在该行上可以接受迭代器类型set<int, int>::iterator

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

为什么在该行上可以接受迭代器类型set<int, int>::iterator

不是。int不是比较器。您正在违反那里的标准要求。该程序的形式不佳。

一些编译器更严格地检查这些要求。


供参考:正确的类型为set<int, greater<int> >::iterator,或CC 11及以后的autoset<int>::iterator也是错误的。