Unordered_map со странным поведением при доступе к элементам - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть неупорядоченная карта, которая выглядит так:

std::unordered_map<std::string, double> payments = { {"8/18", 0.0}, {"7/18", 771.98}, {"6/18", 0.0}, {"5/18", 771.98},
                                                    {"4/18", 771.98}, {"3/18", 771.98}, {"2/18", 0.0}, {"1/18", 3859.90},
                                                    {"12/17", 771.98}, {"11/17", 0.0}, {"10/17", 1543.96}, {"9/17", 771.98} };

Когда я печатаю второй элемент так:

for (auto it : payments)
    {
        std::cout << it.second << " ";
    }

Я понял:

0 771.98 0 0 771.98 1543.96 771.98 771.98 771.98 3859.9 771.98

Как видите, у меня есть дополнительный ноль, и порядок не тот. Как мне это исправить?

1 Ответ

0 голосов
/ 16 ноября 2018

Вы используете std::unordered_map. Это означает, что элементы хранятся в произвольном порядке. Ваш код работает "правильно". Если вы хотите, чтобы ордер был сохранен, вам нужен массив, подобный контейнеру std::pair, как std::vector<std::pair<std::string, double>>. Пример:

int main()
{
    std::vector<std::pair<std::string, double>> payments = { {"8/18", 0.0}, {"7/18", 771.98}, {"6/18", 0.0}, {"5/18", 771.98},
                                                             {"4/18", 771.98}, {"3/18", 771.98}, {"2/18", 0.0}, {"1/18", 3859.90},
                                                             {"12/17", 771.98}, {"11/17", 0.0}, {"10/17", 1543.96}, {"9/17", 771.98} };

    for (auto it : payments)
    {
        std::cout << it.second << " ";
    }
}

Выходы:

0 771.98 0 771.98 771.98 771.98 0 3859.9 771.98 0 1543.96 771.98 
...