Нужен ли многокартовому итератору также тип функции сортировки? - PullRequest
2 голосов
/ 09 февраля 2012

Надеюсь, это быстрый и простой вопрос. Нужно ли мне bool(*)(char,char) в моем typedef ниже или я могу просто использовать multimap<char,char>::iterator для использования mmIt итераторов с картой mmap? Спасибо за помощь!

Фрагмент кода:

bool fncomp (char lhs, char rhs) {return lhs < rhs;}
typedef multimap<char,int,bool(*)(char,char)>::iterator mmIt;
multimap<char,int,bool(*)(char,char)> mmap(fncomp);

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

Если multimap<K,V,Comp>::iterator - это typedef для чего-то другого, не зависящего от типа компаратора, вы можете быть в порядке - но это деталь реализации и обязательно сломается, если это действительно вложенный тип.

Просто обойди это:

typedef multimap<char,int,bool(*)(char,char)> mMap;
typedef mMap::iterator mmIt;

и не пишите весь список параметров мультикарты везде.

0 голосов
/ 09 февраля 2012

Стандарт позволяет вашему коду быть правильным, но он не гарантирует его.

Например, Visual Studio 11 имеет так называемый SCARY итераторы , которые не зависят от ненужных типов контейнера (распределитель, предикат).Однако, если итераторы реализованы таким образом, это полностью определяется реализацией.

0 голосов
/ 09 февраля 2012

Хотя итератору не нужна функция сравнения, итератор, скажем, для std::map<char,int,std::less<char>>, как правило, является совершенно другим типом, чем итератор, скажем, для std::map<char,int,std::greater<char>>, поскольку тип итератора определяется внутри конкретного типа карты ипоэтому на нем.

A std::map<K,T> на самом деле является сокращением для std::map<K,T,std::less<K>,std::allocator<std::pair<const K,T>>>.Поэтому, если компаратор вашей карты отличается от компаратора по умолчанию (который в вашем случае равен std::less<char>), вам необходимо явно создавать экземпляр типа карты вместе с ним при каждом его использовании.

...