在地图中指定键值 - 特殊字符串(%和$)

时间:2016-01-22 13:58:01

标签: c++ c++11 dictionary

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

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

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

任何人都知道为什么会这样吗?保持顺序对我来说是必须的,任何建议如何摆脱它。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

显而易见的缺点是,您的密钥的唯一性将不再自动强制执行,因此您需要注意这一点 - 这会带来巨大的性能损失。

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

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

答案 2 :(得分:0)

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

我认为您很难进行插入订单迭代,但这不是地图的重点。