Порядок сортировки на карте STL и набор - PullRequest
8 голосов
/ 30 июля 2010

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

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

} 

Как будут отсортированы значения?

Ответы [ 2 ]

8 голосов
/ 30 июля 2010

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

3 голосов
/ 30 июля 2010

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

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