如何解决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<
类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。