使用c ++ STL map无法得到正确的答案

时间:2014-04-04 07:52:42

标签: c++ 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

我不知道为什么会出错。

4 个答案:

答案 0 :(得分:2)

请注意map specification唯一键部分。

  

唯一键
       容器中没有两个元素可以具有等效键。

这意味着对于每个唯一键(在您的情况下为5.81),只能有一个值:最后一个键(10:48)。对于非唯一地图,请使用multimap

有关multimap和map之间差异的讨论:see this

答案 1 :(得分:1)

myMap每个密钥只能存储一个值:密钥5.81是重复的。

您正在覆盖值“10:44”,随后插入5.81 - &gt; “10.48”。

如果您想要单个密钥的重复值,请使用std::multimap

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

来自documentation

  

地图是关联容器,用于存储按照特定顺序组合键值和映射值形成的元素。

     

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

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

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

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键的问题,它或多或少都是一样的。