std :: unordered_map行为不符合预期

问题描述

idenitier.quote

我希望地图按该顺序具有这些元素,但实际上是:

-SIZEY

-ELEMENTTYPE

-STYLEFILE

-SIZEX

-POSITIONX

-位置

我很困惑;为什么std::unordered_map<std::string,std::string> mymap; mymap.insert(std::make_pair("ELEMENTTYPE","NEWINTERFACE")); mymap.insert(std::make_pair("STYLEFILE","Style_Light.txt")); mymap.insert(std::make_pair("ELEMENTNAME","IN1")); mymap.insert(std::make_pair("POSITIONX","0")); mymap.insert(std::make_pair("POSITIONY","0")); mymap.insert(std::make_pair("SIZEX","50")); mymap.insert(std::make_pair("SIZEY","50")); 对元素进行排序?

解决方法

std::unordered_map中的无序术语表示未指定顺序。您不能依赖unordered_*容器的顺序。所有关联容器(将值映射到键的容器)都会弄乱元素的顺序,因为这种顺序使它们在按键搜索时可以获得更好的性能,这通常是使用映射的目的。

如果您想自己控制订单,可以使用std::vector<std::pair<std::string,std::string>>。您将有一组对,以您想要的方式排序,但是您将失去关联容器提供的快速find实现。

,

您想要特定的任意顺序
std :: unordered_map没有可以控制的特定顺序
std :: map根据功能对键进行排序

如果您想要使用c ++中的python的OrderedDict之类的东西,这里有一些重复的答案:
C++ dictionary/map with added order
A std::map that keep track of the order of insertion?

当您真正需要的只是一个基本的struct对象时,也许您想变得太花哨了。它只是一个变量,其成员只是您在何时,如何获得的变量。

#include <vector>
#include <string>
enum elementtype_enum { NEWINTERFACE,OTHER };

struct my_element_type {
    std::string name;
    elementtype_enum type;
    std::string style_file;
    int positionx,positiony,sizex,sizey;
};

int main() { 

    std::vector<my_element_type> elements;
    my_element_type e { "IN1",NEWINTERFACE,"Style_Light.txt",50,50 };
    elements.push_back(e);
    return 0;
}
,

顾名思义,std::unordered_map无序。其元素的顺序是不确定的,并且取决于Key值的 hash

如果元素的顺序对您很重要,请改用std::map。默认情况下,它使用Key的{​​{1}}进行排序,但是如果您想自己订购元素,则可以选择提供自定义operator<类型。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...