在映射中分配键值 - 特殊字符串(% 和 $)

Assign key value in map - special strings(% and $)

本文关键字:字符串 映射 分配 键值      更新时间:2023-10-16

我在C++有以下地图代码-

std::map<std::string, std::string> vals;
vals["%"] = "PERCENT";
vals["$"] = "DOLLAR";
vals["="] = "EQUAL";

使用上面的代码行,我预计 % 将在索引 0 处,$ 在索引 1 处。但是当我编译和调试时,我总是在索引 0 处找到 $,在索引 1 处找到 %。

有人知道为什么会发生这种情况吗? 维护顺序对我来说是必须的,任何建议我如何摆脱它。

那是因为std::map对其内容进行排序。插入顺序无关紧要。在这里,它将按字母顺序排序。(因为键值是std::string)由于$的值低于%这意味着$ == vals.begin() .这也是为什么在map中用作键的用户定义类型需要重载其operator<的原因。

没有保留插入顺序的"自然"标准字典容器。std::mapstd::unordered_map都不会这样做。如果需要保留插入顺序,则需要使用可以执行此操作并插入std::pair<your_key_type, your_value_type>的容器。

这样做的明显缺点是密钥的唯一性将不再自动强制执行,因此这是您必须注意的事情 - 巨大的性能损失。

适合您的3个标准容器是std::vectorstd::dequestd::list,性能最高的容器通常是std::vector

还有第三方库(例如boost),它们有一些可能也适合你的容器。

在这种情况下,您不能将下标运算符视为数组索引。对于 std::map 运算符是重载的,其中 [] 的内容是键的模板化类型。在本例中,您使用字符串来字符串映射,因此将字符串放在 [] 中。至于在迭代内容时内容如何排序,我认为这个 STL 实现是特定的。但是,查看链接映射,您会发现可以选择提供可以覆盖默认排序的比较器。

我认为您很难进行广告顺序迭代,但这不是地图的重点。