unordered_map顺序怎么乱了

时间:2023-01-31 12:51:43
用以下的代码:


std::tr1::unordered_map<std::wstring,std::wstring> dict;

dict.insert(std::make_pair(L"DbServer",strDbServer));
dict.insert(std::make_pair(L"DbName",strDbName));
dict.insert(std::make_pair(L"DbPort",strDbPort));
dict.insert(std::make_pair(L"DbUserName",strDbUserName));
dict.insert(std::make_pair(L"DbPassword",strDbPassword));



执行完了以后,dict的元素如下:

    [0]: ("DbServer","localhost")
    [1]: ("DbName","test")
    [2]: ("DbUserName","root")
    [3]: ("DbPort","3306")
    [4]: ("DbPassword","11111111")

为什么第三个和第四个元素的顺序颠倒了那?

请指教,谢谢。

13 个解决方案

#1


unordered_map unordered_map顺序怎么乱了

#2


引用 1 楼 dustpg 的回复:
unordered_map unordered_map顺序怎么乱了

unordered map不自动排序,不是应该按照插入的顺序存吗?

#3


为什么要按照插入顺序排, 如果是,那不就是ordered_map了么,一般实现就是hash表,顺序的话不就毫无意义了么

#4


unordered map是hash表。不是排序的。只有map是排序的。

#5


引用 4 楼 oyljerry 的回复:
unordered map是hash表。不是排序的。只有map是排序的。


map排序是按照键的字母顺序排序,unordered map是胡乱排序。
我就想让它按照我插入的顺序排序,怎么就那么难啊。 

#6


引用 5 楼 time_is_life 的回复:
Quote: 引用 4 楼 oyljerry 的回复:

unordered map是hash表。不是排序的。只有map是排序的。


map排序是按照键的字母顺序排序,unordered map是胡乱排序。
我就想让它按照我插入的顺序排序,怎么就那么难啊。 


链表,数组啊,在尾部插入数据不就行了么

#7


引用 5 楼 time_is_life的回复:
Quote: 引用 4 楼 oyljerry 的回复:

unordered map是hash表。不是排序的。只有map是排序的。


map排序是按照键的字母顺序排序,unordered map是胡乱排序。
我就想让它按照我插入的顺序排序,怎么就那么难啊。 

你要按插入顺序就需要用vector等

#8


是啊,在尾部追加内容用list或者vector多方便

#9


list和vector插入的不是键值对,是一个对象,要构造对象然后才能插入,遍历时还要一个个还原,好麻烦。
c#中有个Dictionary<T,T>就是按照插入顺序存储的,c++没有对应的集合吗?

#10


map不就是按照你插入顺序存储的么?

#11


	map<const char*,int> m;
m.insert(make_pair("a",1));
m.insert(make_pair("b",2));
m.insert(make_pair("c",3));
m.insert(make_pair("d",4));
map<const char*,int>::reverse_iterator it;
it=m.rbegin();
while(it!=m.rend()){
cout << it->first<<";"<<it->second<<endl;
++it;
}

#12


引用 11 楼 lx624909677 的回复:
	map<const char*,int> m;
m.insert(make_pair("a",1));
m.insert(make_pair("b",2));
m.insert(make_pair("c",3));
m.insert(make_pair("d",4));
map<const char*,int>::reverse_iterator it;
it=m.rbegin();
while(it!=m.rend()){
cout << it->first<<";"<<it->second<<endl;
++it;
}

map是根据less<T>的顺序。

#13


引用 9 楼 time_is_life 的回复:
list和vector插入的不是键值对,是一个对象,要构造对象然后才能插入,遍历时还要一个个还原,好麻烦。
c#中有个Dictionary<T,T>就是按照插入顺序存储的,c++没有对应的集合吗?

vector<std::pair<> > ;
不就行了么,不需要还原啊。

#1


unordered_map unordered_map顺序怎么乱了

#2


引用 1 楼 dustpg 的回复:
unordered_map unordered_map顺序怎么乱了

unordered map不自动排序,不是应该按照插入的顺序存吗?

#3


为什么要按照插入顺序排, 如果是,那不就是ordered_map了么,一般实现就是hash表,顺序的话不就毫无意义了么

#4


unordered map是hash表。不是排序的。只有map是排序的。

#5


引用 4 楼 oyljerry 的回复:
unordered map是hash表。不是排序的。只有map是排序的。


map排序是按照键的字母顺序排序,unordered map是胡乱排序。
我就想让它按照我插入的顺序排序,怎么就那么难啊。 

#6


引用 5 楼 time_is_life 的回复:
Quote: 引用 4 楼 oyljerry 的回复:

unordered map是hash表。不是排序的。只有map是排序的。


map排序是按照键的字母顺序排序,unordered map是胡乱排序。
我就想让它按照我插入的顺序排序,怎么就那么难啊。 


链表,数组啊,在尾部插入数据不就行了么

#7


引用 5 楼 time_is_life的回复:
Quote: 引用 4 楼 oyljerry 的回复:

unordered map是hash表。不是排序的。只有map是排序的。


map排序是按照键的字母顺序排序,unordered map是胡乱排序。
我就想让它按照我插入的顺序排序,怎么就那么难啊。 

你要按插入顺序就需要用vector等

#8


是啊,在尾部追加内容用list或者vector多方便

#9


list和vector插入的不是键值对,是一个对象,要构造对象然后才能插入,遍历时还要一个个还原,好麻烦。
c#中有个Dictionary<T,T>就是按照插入顺序存储的,c++没有对应的集合吗?

#10


map不就是按照你插入顺序存储的么?

#11


	map<const char*,int> m;
m.insert(make_pair("a",1));
m.insert(make_pair("b",2));
m.insert(make_pair("c",3));
m.insert(make_pair("d",4));
map<const char*,int>::reverse_iterator it;
it=m.rbegin();
while(it!=m.rend()){
cout << it->first<<";"<<it->second<<endl;
++it;
}

#12


引用 11 楼 lx624909677 的回复:
	map<const char*,int> m;
m.insert(make_pair("a",1));
m.insert(make_pair("b",2));
m.insert(make_pair("c",3));
m.insert(make_pair("d",4));
map<const char*,int>::reverse_iterator it;
it=m.rbegin();
while(it!=m.rend()){
cout << it->first<<";"<<it->second<<endl;
++it;
}

map是根据less<T>的顺序。

#13


引用 9 楼 time_is_life 的回复:
list和vector插入的不是键值对,是一个对象,要构造对象然后才能插入,遍历时还要一个个还原,好麻烦。
c#中有个Dictionary<T,T>就是按照插入顺序存储的,c++没有对应的集合吗?

vector<std::pair<> > ;
不就行了么,不需要还原啊。