С++ std:: map элементов в порядке убывания ключей

Как cal я использую контейнер std:: map со значением ключа в порядке убывания.

В качестве примера вставьте следующие элементы:

[2 , 5]
[1 , 34]
[3 , 67]

Они будут упорядочены на карте, например:

position 0: [1, 34]
position 1: [2, 5]
position 2: [3, 67]

Я могу выполнить итерацию по карте обратно, но предположим, что в следующий раз я вставляю [-1, 60]. Будет ли он помещен в первую позицию?

Ответ 1

Используйте произвольный компаратор, когда заказ по умолчанию не делает его для вас.
Вы передаете его в качестве третьего параметра шаблона (который обычно по умолчанию равен std::less<KeyType>).
В вашем случае вы можете использовать std::greater:

std::map<int, int, std::greater<int> > m;

Пример кода:

#include <map>
#include <iostream>
#include <functional>

int main() {
  std::map<int, int, std::greater<int>> m { {-1, 77}, {0, 42}, {1, 84} };
  for (const auto& p : m)
    std::cout << '[' << p.first << ',' << p.second << "]\n";
}

Результат:

[1,84]
[0,77]
[-1,42]

Ответ 2

std::map уже отсортирован, поэтому вам нужно всего лишь пересечь карту, используя reverse_iterator.

Однако карта не является массивом. В карте нет такой вещи, как "n-я позиция". (std::map чаще всего реализуется с использованием своего рода двоичного дерева поиска.) Если вы абсолютно, неизбежно должны указать порядок вручную, используйте std::vector<std::pair>.