繁体   English   中英

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

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

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

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被复制。

您随后插入5.81->“ 10.48”时将覆盖值“ 10:44”。

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

(此外,请注意将浮点类型用作键。浮点比较会遇到问题。)

在第一个周期的最后一次迭代中,您正在更新myMap [5.81],之前已在上面添加了2次迭代(不添加新元素)。 考虑使用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问题,则大致相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM