создание карты с векторным / списочным итератором в качестве ключа - PullRequest
1 голос
/ 16 октября 2019

Я запутался в причине этой огромной ошибки в g++ в этом коде:

#include<iostream>
#include<map>
#include<utility>
#include<vector>
#include<list>

using namespace std;

int main()
{
    list<int> p={1,2,3,4};

    map<list<int>::iterator, int> q;

    q[p.begin()]=9991;

    cout<<q[p.begin()]<<endl;
    return 0;
}

Ошибка при использовании list, но не при использовании vector - почему? Я понимаю, как ведет себя list \ vector (теоретически), но все же не могу найти причину для этого.

ОШИБКА:

ошибка: для 'operator <' нет соответствия (типы операндов: 'const std :: _ List_iterator' и 'const std :: _ List_iterator') {return __x <__y;} </p>

1 Ответ

4 голосов
/ 16 октября 2019

Стандартный класс std:: list имеет двунаправленные итераторы, которые не имеют operator <, в то время как std::vector имеет итераторы прямого доступа, для которых определен operator <.

Этот operator < используется дляупорядочение данных в std::map, потому что по умолчанию используется объект функции std::less.

Вот объявление шаблона класса std :: map

template<class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key, T>>>
class map;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...