无法使用 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 是重复的。
您正在覆盖值"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
键的问题,它或多或少是相同的。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 欧拉项目#8答案是大以获得有效答案
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 首要问题的答案让值班员搞错了
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 在c++中访问int到类对象的映射时出错
- 在C++中搜索嵌套多映射值
- 错误处理.将系统错误代码映射到泛型
- C++匿名结构作为std::映射值
- 无法使用 c++ STL 映射获得正确答案