Тип итератора, возвращаемый set2.begin () - PullRequest
0 голосов
/ 23 февраля 2019

В вопросе викторины я думал, что следующая программа не будет компилироваться, потому что я ожидал, что тип итератора будет 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;
}

1 Ответ

0 голосов
/ 23 февраля 2019

Почему тип итератора set<int, int>::iterator допустим в этой строке?

Это не так.int не является компаратором.Вы нарушаете требования стандарта там.Программа некорректна.

Некоторые компиляторы проверяют эти требования более строго.


Для справки: правильный тип будет set<int, greater<int> >::iterator, или дляC ++ 11 и позже просто auto.set<int>::iterator также будет неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...