无法使用 c++ STL 映射获得正确答案

Can't get the right answer with c++ STL map

本文关键字:答案 映射 STL c++      更新时间:2023-10-16

我写了一个小地图测试程序,如下所示:

void main()
{
    vector<double> price;
    vector<string> time;
    price.push_back(5.70);
    price.push_back(5.77);
    price.push_back(5.81);
    price.push_back(5.72);
    price.push_back(5.81);
    time.push_back("10:40");
    time.push_back("10:43");
    time.push_back("10:44");
    time.push_back("10:46");
    time.push_back("10:48");
    map<double,string> myMap;
    for (int i=0 ; i<price.size() ; i++)
    {   myMap[price[i]] = time[i]; }
    for (int i=0 ; i<price.size() ; i++)
    {   
        if (price[i] == 5.81)
        { cout << myMap[price[i]] << endl; }
    }
}

我的期望输出应该是:

10:44
10:48

但我得到的输出是:

10:48
10:48

我不知道为什么是错的。

请注意映射规范的唯一部分。

唯一键
容器中的任何两个元素都不能具有等效的键。

这意味着对于每个唯一键(在本例中为 5.81),只能有一个值:最后一个集合 (10:48)。 对于非唯一地图,请使用多重地图

有关多映射和映射之间区别的讨论:请参阅此处

myMap每个

键只能存储一个值:键 5.81 是重复的。

您正在覆盖值"10:44",随后插入 5.81 ->"10.48"。

如果要为单个键提供重复值,请使用 std::multimap

(另外,请注意使用浮点类型作为键。浮点比较会遇到问题。

在第一个周期的最后一次迭代中,您正在更新之前添加的 2 次迭代的 myMap[5.81](不添加新元素)。考虑使用 std::multimap

来自文档

映射

是关联容器,用于存储由键值和映射值的组合形成的元素,遵循特定顺序。

在映射中,键值

通常用于对元素进行排序和唯一标识,而映射值存储与此键关联的内容。

因此,每个键只能有一个值,这就是为什么它打印两次相同的值的原因。

此外,您可以替换代码的这一部分:

for (int i=0 ; i<price.size() ; i++)
{   
    if (price[i] == 5.81)
    { cout << myMap[price[i]] << endl; }
}
// by
cout << myMap[5.81] << endl;

如果您不考虑double键的问题,它或多或少是相同的。