我写了一个小地图测试程序,如下所示:
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
我不知道为什么会出错。
答案 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)
地图是关联容器,用于存储按照特定顺序组合键值和映射值形成的元素。
在地图中,键值通常用于排序和唯一标识元素,而映射值存储与此键关联的内容。
因此,每个键只能有一个值,这就是它打印两次相同值的原因。
此外,您可以替换代码的这一部分:
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
键的问题,它或多或少都是一样的。