Порядок сортировки в карте STL и наборе

Как определяемые пользователем объекты отсортированы в карте и установлены? Насколько я знаю, карта/набор Отсортированы Ассоциативные Контейнеры: вставляемые элементы отсортированы на основе клавиши, которую это удерживает.

Но карта и набор внутренне используют 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; 

} 

Как значения отсортировать?

8
задан Martin York 30 July 2010 в 13:41
поделиться

2 ответа

std::map использует функтор для сортировки элементов. По умолчанию это std::less , который использует оператор <. В вашем примере есть пользовательский функтор ltstr, который поможет сортировать элементы по своим ключам в алфавитном порядке.

8
ответ дан 5 December 2019 в 15:17
поделиться

Прежде всего По умолчанию используется оператор <, а не оператор> . В вашем случае вы передаете настраиваемую функцию сравнения, передавая третий параметр шаблона при создании объекта карты. При вставке каждого элемента на карту этот функтор сравнения используется для определения относительного порядка объекта на карте, то есть он используется для сравнения ключей. Например, если указать месяцев ["февраль"] = 28; , map сравнивает ключи "январь" и "февраль". Поскольку мы выполняем сравнение строк, это сравнение возвращает значение больше 0. Это значение используется для определения положения ключа «февраль» по отношению к «январь».

3
ответ дан 5 December 2019 в 15:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: