Как определяемые пользователем объекты отсортированы в карте и установлены? Насколько я знаю, карта/набор Отсортированы Ассоциативные Контейнеры: вставляемые элементы отсортированы на основе клавиши, которую это удерживает.
Но карта и набор внутренне используют operator >
отсортировать их элементы.
От сайта SGI у меня есть следующие примеры:
struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
int main()
{
map<const char*, int, ltstr> months;
months["january"] = 31;
months["february"] = 28;
months["march"] = 31;
months["april"] = 30;
months["may"] = 31;
months["june"] = 30;
months["july"] = 31;
months["august"] = 31;
months["september"] = 30;
months["october"] = 31;
months["november"] = 30;
months["december"] = 31;
cout << "june -> " << months["june"] << endl;
map<const char*, int, ltstr>::iterator cur = months.find("june");
map<const char*, int, ltstr>::iterator prev = cur;
map<const char*, int, ltstr>::iterator next = cur;
++next;
--prev;
cout << "Previous (in alphabetical order) is " << (*prev).first << endl;
cout << "Next (in alphabetical order) is " << (*next).first << endl;
}
В вышеупомянутом примере, как значения отсортированы?
Править: Код перемещен из комментария:
typedef map <string, int> Mint ;
int main()
{
string Name ;
int Marks;
Mint Grade;
for (int i = 0; i<4; i++)
{
cin>> Name ;
cin >> Marks;
Grade [Name] = Marks ;
}
Mint :: iterator iter;
for( iter = Grade.begin(); iter != Grade.end(); iter++)
cout<< (*iter).first<<“ \t ” <<(*iter).second<<“\n” ;
return 0;
}
Как значения отсортировать?
std::map
использует функтор для сортировки элементов. По умолчанию это std::less
, который использует оператор <
. В вашем примере есть пользовательский функтор ltstr
, который поможет сортировать элементы по своим ключам в алфавитном порядке.
Прежде всего По умолчанию используется оператор <
, а не оператор>
. В вашем случае вы передаете настраиваемую функцию сравнения, передавая третий параметр шаблона при создании объекта карты. При вставке каждого элемента на карту этот функтор сравнения используется для определения относительного порядка объекта на карте, то есть он используется для сравнения ключей. Например, если указать месяцев ["февраль"] = 28;
, map сравнивает ключи "январь" и "февраль". Поскольку мы выполняем сравнение строк, это сравнение возвращает значение больше 0. Это значение используется для определения положения ключа «февраль» по отношению к «январь».