Unordered_map在访问元素时有奇怪的行为

时间:2018-11-16 17:45:35

标签: c++ unordered-map

我有一个看起来像这样的无序地图:

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 :(得分:4)

您正在使用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