在映射中分配键值 - 特殊字符串(% 和 $)
Assign key value in map - special strings(% and $)
我在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::map
和std::unordered_map
都不会这样做。如果需要保留插入顺序,则需要使用可以执行此操作并插入std::pair<your_key_type, your_value_type>
的容器。
这样做的明显缺点是密钥的唯一性将不再自动强制执行,因此这是您必须注意的事情 - 巨大的性能损失。
适合您的3个标准容器是std::vector
,std::deque
和std::list
,性能最高的容器通常是std::vector
。
还有第三方库(例如boost),它们有一些可能也适合你的容器。
在这种情况下,您不能将下标运算符视为数组索引。对于 std::map 运算符是重载的,其中 [] 的内容是键的模板化类型。在本例中,您使用字符串来字符串映射,因此将字符串放在 [] 中。至于在迭代内容时内容如何排序,我认为这个 STL 实现是特定的。但是,查看链接映射,您会发现可以选择提供可以覆盖默认排序的比较器。
我认为您很难进行广告顺序迭代,但这不是地图的重点。
- 如何使用Visual Studio 2008将字符串映射到函数?
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 在声明unordered_map的错误中,将字符串映射到模板
- 将字符串映射到矢量或将不同的键映射到一个值
- 使用 C++11 可变参数模板初始化枚举到字符串映射
- 将字符串映射到 C++ 中的类函数
- 根据该输入字符串将字符串映射到不同的类
- 如何访问 <int,字符串>映射中的特定字符?
- C字符串映射键
- C 索引中的字符串映射而无需分配
- 实现将字符串映射到 C++ 中的数组的哈希表。我一直在"Debug Assertion Failed",我不知道为什么
- 将字符串映射到无符号 int 到无符号 int 的映射
- C++ std::将字符串映射到指针
- c++将大型数字字符串映射到数字字符串范围
- 使用字符串映射的向量时可能会发生内存泄漏C++
- 一个比较2个字符串映射的通用C++规则引擎
- 如何在c++中仅针对键的子集有效地比较两个字符串映射
- 如何将用户输入(字符串)映射到Enum值
- 我如何消除这个枚举到字符串映射代码的样板文件?