Unordered map iterating by values
up vote
1
down vote
favorite
I have a weird issue that I don't know if I am miss reading the documentation or my computer is doing something strange.
I have an unordered_map. I want to iterate over the buckets of the unordered_map in bucket order. This part is important as I need the access to be relatively random. I searched over cplusplus.com and I found this. The code is as follows:
// unordered_map::bucket
#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
std::unordered_map<std::string,std::string> mymap = {
{"us","United States"},
{"uk","United Kingdom"},
{"fr","France"},
{"de","Germany"}
};
for (auto& x: mymap) {
std::cout << "Element [" << x.first << ":" << x.second << "]";
std::cout << " is in bucket #" << mymap.bucket (x.first) << std::endl;
}
return 0;
}
The output I was expecting and wanted on my computer was
Element [us:United States] is in bucket #1
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #2
Element [uk:United Kingdom] is in bucket #4
However the output I am getting is instead sorted by value type which is strange
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #1
Element [us:United States] is in bucket #1
I even tried replacing the value with a class that had no comparison operators and it still was able to sort them. Is this something with the way my computer is storing the map or is cplusplus.com outdated? I was able to iterate over the buckets through a loop like this:
for ( unsigned int i = 0; i < b.bucket_count(); ++i) {
for ( hash_table::const_local_iterator image_iterator =
b.begin(i);image_iterator!= b.end(i); ++image_iterator ){
The only issue is that I need to be able to skip a certain number of values i.e. I only want 1 item for every 100 which requires complicated loops and is slow.
Any help would be appreciated. I can't seem to figure this out!
[EDIT]
With my code my unordered_map is actually unordered_map where point is a simple class that just has two member variables and no helper functions.
When I run the loop above on my map here is my output. I have linked a text file as it is a pretty long file here
What confuses me even more is that my Point class has no comparison operators. Could it be my insertion order that is causing this?
c++ c++11 unordered-map
|
show 17 more comments
up vote
1
down vote
favorite
I have a weird issue that I don't know if I am miss reading the documentation or my computer is doing something strange.
I have an unordered_map. I want to iterate over the buckets of the unordered_map in bucket order. This part is important as I need the access to be relatively random. I searched over cplusplus.com and I found this. The code is as follows:
// unordered_map::bucket
#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
std::unordered_map<std::string,std::string> mymap = {
{"us","United States"},
{"uk","United Kingdom"},
{"fr","France"},
{"de","Germany"}
};
for (auto& x: mymap) {
std::cout << "Element [" << x.first << ":" << x.second << "]";
std::cout << " is in bucket #" << mymap.bucket (x.first) << std::endl;
}
return 0;
}
The output I was expecting and wanted on my computer was
Element [us:United States] is in bucket #1
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #2
Element [uk:United Kingdom] is in bucket #4
However the output I am getting is instead sorted by value type which is strange
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #1
Element [us:United States] is in bucket #1
I even tried replacing the value with a class that had no comparison operators and it still was able to sort them. Is this something with the way my computer is storing the map or is cplusplus.com outdated? I was able to iterate over the buckets through a loop like this:
for ( unsigned int i = 0; i < b.bucket_count(); ++i) {
for ( hash_table::const_local_iterator image_iterator =
b.begin(i);image_iterator!= b.end(i); ++image_iterator ){
The only issue is that I need to be able to skip a certain number of values i.e. I only want 1 item for every 100 which requires complicated loops and is slow.
Any help would be appreciated. I can't seem to figure this out!
[EDIT]
With my code my unordered_map is actually unordered_map where point is a simple class that just has two member variables and no helper functions.
When I run the loop above on my map here is my output. I have linked a text file as it is a pretty long file here
What confuses me even more is that my Point class has no comparison operators. Could it be my insertion order that is causing this?
c++ c++11 unordered-map
Note that your output is also sorted by key type and also sequential by bucket, but starting at#2
with modulo arithmetic.
– François Andrieux
Nov 22 at 16:02
As far as I know, the order of elements when iterating over anstd::unordered_map
is unspecified. I understand why you might expect it to order them by bucket but I don't know of anything that guaranties it. Evidently that's not what's happening here.
– François Andrieux
Nov 22 at 16:04
3
It's not clear what documentation you are referring to. The order of iterating overunordered_map
is not specified so should not be given by any documentation.
– François Andrieux
Nov 22 at 16:10
3
It's just a coincidence. I can reproduce with the specific keys you show, but change them to"a"
,"b"
,"c"
, "d
" and the output is no longer sorted (either by key or by bucket). Unordered map is unordered.
– Igor Tandetnik
Nov 22 at 16:13
1
@MichaelHonaker The bottom line is you cannot rely onunordered_map
's ordering of elements. The order is unspecified, but it doesn't mean random. So even a strangely well ordered sequence can be a legitimate ordering.
– François Andrieux
Nov 22 at 16:30
|
show 17 more comments
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I have a weird issue that I don't know if I am miss reading the documentation or my computer is doing something strange.
I have an unordered_map. I want to iterate over the buckets of the unordered_map in bucket order. This part is important as I need the access to be relatively random. I searched over cplusplus.com and I found this. The code is as follows:
// unordered_map::bucket
#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
std::unordered_map<std::string,std::string> mymap = {
{"us","United States"},
{"uk","United Kingdom"},
{"fr","France"},
{"de","Germany"}
};
for (auto& x: mymap) {
std::cout << "Element [" << x.first << ":" << x.second << "]";
std::cout << " is in bucket #" << mymap.bucket (x.first) << std::endl;
}
return 0;
}
The output I was expecting and wanted on my computer was
Element [us:United States] is in bucket #1
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #2
Element [uk:United Kingdom] is in bucket #4
However the output I am getting is instead sorted by value type which is strange
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #1
Element [us:United States] is in bucket #1
I even tried replacing the value with a class that had no comparison operators and it still was able to sort them. Is this something with the way my computer is storing the map or is cplusplus.com outdated? I was able to iterate over the buckets through a loop like this:
for ( unsigned int i = 0; i < b.bucket_count(); ++i) {
for ( hash_table::const_local_iterator image_iterator =
b.begin(i);image_iterator!= b.end(i); ++image_iterator ){
The only issue is that I need to be able to skip a certain number of values i.e. I only want 1 item for every 100 which requires complicated loops and is slow.
Any help would be appreciated. I can't seem to figure this out!
[EDIT]
With my code my unordered_map is actually unordered_map where point is a simple class that just has two member variables and no helper functions.
When I run the loop above on my map here is my output. I have linked a text file as it is a pretty long file here
What confuses me even more is that my Point class has no comparison operators. Could it be my insertion order that is causing this?
c++ c++11 unordered-map
I have a weird issue that I don't know if I am miss reading the documentation or my computer is doing something strange.
I have an unordered_map. I want to iterate over the buckets of the unordered_map in bucket order. This part is important as I need the access to be relatively random. I searched over cplusplus.com and I found this. The code is as follows:
// unordered_map::bucket
#include <iostream>
#include <string>
#include <unordered_map>
int main ()
{
std::unordered_map<std::string,std::string> mymap = {
{"us","United States"},
{"uk","United Kingdom"},
{"fr","France"},
{"de","Germany"}
};
for (auto& x: mymap) {
std::cout << "Element [" << x.first << ":" << x.second << "]";
std::cout << " is in bucket #" << mymap.bucket (x.first) << std::endl;
}
return 0;
}
The output I was expecting and wanted on my computer was
Element [us:United States] is in bucket #1
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #2
Element [uk:United Kingdom] is in bucket #4
However the output I am getting is instead sorted by value type which is strange
Element [de:Germany] is in bucket #2
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #1
Element [us:United States] is in bucket #1
I even tried replacing the value with a class that had no comparison operators and it still was able to sort them. Is this something with the way my computer is storing the map or is cplusplus.com outdated? I was able to iterate over the buckets through a loop like this:
for ( unsigned int i = 0; i < b.bucket_count(); ++i) {
for ( hash_table::const_local_iterator image_iterator =
b.begin(i);image_iterator!= b.end(i); ++image_iterator ){
The only issue is that I need to be able to skip a certain number of values i.e. I only want 1 item for every 100 which requires complicated loops and is slow.
Any help would be appreciated. I can't seem to figure this out!
[EDIT]
With my code my unordered_map is actually unordered_map where point is a simple class that just has two member variables and no helper functions.
When I run the loop above on my map here is my output. I have linked a text file as it is a pretty long file here
What confuses me even more is that my Point class has no comparison operators. Could it be my insertion order that is causing this?
c++ c++11 unordered-map
c++ c++11 unordered-map
edited Nov 26 at 14:57
Cubbi
38k665144
38k665144
asked Nov 22 at 15:55
Michael Honaker
83
83
Note that your output is also sorted by key type and also sequential by bucket, but starting at#2
with modulo arithmetic.
– François Andrieux
Nov 22 at 16:02
As far as I know, the order of elements when iterating over anstd::unordered_map
is unspecified. I understand why you might expect it to order them by bucket but I don't know of anything that guaranties it. Evidently that's not what's happening here.
– François Andrieux
Nov 22 at 16:04
3
It's not clear what documentation you are referring to. The order of iterating overunordered_map
is not specified so should not be given by any documentation.
– François Andrieux
Nov 22 at 16:10
3
It's just a coincidence. I can reproduce with the specific keys you show, but change them to"a"
,"b"
,"c"
, "d
" and the output is no longer sorted (either by key or by bucket). Unordered map is unordered.
– Igor Tandetnik
Nov 22 at 16:13
1
@MichaelHonaker The bottom line is you cannot rely onunordered_map
's ordering of elements. The order is unspecified, but it doesn't mean random. So even a strangely well ordered sequence can be a legitimate ordering.
– François Andrieux
Nov 22 at 16:30
|
show 17 more comments
Note that your output is also sorted by key type and also sequential by bucket, but starting at#2
with modulo arithmetic.
– François Andrieux
Nov 22 at 16:02
As far as I know, the order of elements when iterating over anstd::unordered_map
is unspecified. I understand why you might expect it to order them by bucket but I don't know of anything that guaranties it. Evidently that's not what's happening here.
– François Andrieux
Nov 22 at 16:04
3
It's not clear what documentation you are referring to. The order of iterating overunordered_map
is not specified so should not be given by any documentation.
– François Andrieux
Nov 22 at 16:10
3
It's just a coincidence. I can reproduce with the specific keys you show, but change them to"a"
,"b"
,"c"
, "d
" and the output is no longer sorted (either by key or by bucket). Unordered map is unordered.
– Igor Tandetnik
Nov 22 at 16:13
1
@MichaelHonaker The bottom line is you cannot rely onunordered_map
's ordering of elements. The order is unspecified, but it doesn't mean random. So even a strangely well ordered sequence can be a legitimate ordering.
– François Andrieux
Nov 22 at 16:30
Note that your output is also sorted by key type and also sequential by bucket, but starting at
#2
with modulo arithmetic.– François Andrieux
Nov 22 at 16:02
Note that your output is also sorted by key type and also sequential by bucket, but starting at
#2
with modulo arithmetic.– François Andrieux
Nov 22 at 16:02
As far as I know, the order of elements when iterating over an
std::unordered_map
is unspecified. I understand why you might expect it to order them by bucket but I don't know of anything that guaranties it. Evidently that's not what's happening here.– François Andrieux
Nov 22 at 16:04
As far as I know, the order of elements when iterating over an
std::unordered_map
is unspecified. I understand why you might expect it to order them by bucket but I don't know of anything that guaranties it. Evidently that's not what's happening here.– François Andrieux
Nov 22 at 16:04
3
3
It's not clear what documentation you are referring to. The order of iterating over
unordered_map
is not specified so should not be given by any documentation.– François Andrieux
Nov 22 at 16:10
It's not clear what documentation you are referring to. The order of iterating over
unordered_map
is not specified so should not be given by any documentation.– François Andrieux
Nov 22 at 16:10
3
3
It's just a coincidence. I can reproduce with the specific keys you show, but change them to
"a"
, "b"
, "c"
, "d
" and the output is no longer sorted (either by key or by bucket). Unordered map is unordered.– Igor Tandetnik
Nov 22 at 16:13
It's just a coincidence. I can reproduce with the specific keys you show, but change them to
"a"
, "b"
, "c"
, "d
" and the output is no longer sorted (either by key or by bucket). Unordered map is unordered.– Igor Tandetnik
Nov 22 at 16:13
1
1
@MichaelHonaker The bottom line is you cannot rely on
unordered_map
's ordering of elements. The order is unspecified, but it doesn't mean random. So even a strangely well ordered sequence can be a legitimate ordering.– François Andrieux
Nov 22 at 16:30
@MichaelHonaker The bottom line is you cannot rely on
unordered_map
's ordering of elements. The order is unspecified, but it doesn't mean random. So even a strangely well ordered sequence can be a legitimate ordering.– François Andrieux
Nov 22 at 16:30
|
show 17 more comments
1 Answer
1
active
oldest
votes
up vote
3
down vote
accepted
In std::unordered_map
the bucket for a particular element is completely determined by the hash value computed on the key, std::unordered_map
use as the corresponding specialization of std::hash
as default hash function, which is implementation defined and is not even guaranteed to be the same throughout different program execution. see std::hash.
As @François Andrieux said in the comment section, order of iteration of std::unordered_map
is not specified, hence, you cannot expect the same iteration behavior in all machines, e.g the output in my computer is:
Element [de:Germany] is in bucket #0
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #4
Element [us:United States] is in bucket #4
Look at my edit. My confusion is on why it is ordered in that way even though there is no comparison operator
– Michael Honaker
Nov 22 at 16:24
That's right, ..but you can't expect to guess what it is until you try it ... that was what i meant, Fixed ... Thanks
– Jans
Nov 22 at 16:29
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
3
down vote
accepted
In std::unordered_map
the bucket for a particular element is completely determined by the hash value computed on the key, std::unordered_map
use as the corresponding specialization of std::hash
as default hash function, which is implementation defined and is not even guaranteed to be the same throughout different program execution. see std::hash.
As @François Andrieux said in the comment section, order of iteration of std::unordered_map
is not specified, hence, you cannot expect the same iteration behavior in all machines, e.g the output in my computer is:
Element [de:Germany] is in bucket #0
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #4
Element [us:United States] is in bucket #4
Look at my edit. My confusion is on why it is ordered in that way even though there is no comparison operator
– Michael Honaker
Nov 22 at 16:24
That's right, ..but you can't expect to guess what it is until you try it ... that was what i meant, Fixed ... Thanks
– Jans
Nov 22 at 16:29
add a comment |
up vote
3
down vote
accepted
In std::unordered_map
the bucket for a particular element is completely determined by the hash value computed on the key, std::unordered_map
use as the corresponding specialization of std::hash
as default hash function, which is implementation defined and is not even guaranteed to be the same throughout different program execution. see std::hash.
As @François Andrieux said in the comment section, order of iteration of std::unordered_map
is not specified, hence, you cannot expect the same iteration behavior in all machines, e.g the output in my computer is:
Element [de:Germany] is in bucket #0
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #4
Element [us:United States] is in bucket #4
Look at my edit. My confusion is on why it is ordered in that way even though there is no comparison operator
– Michael Honaker
Nov 22 at 16:24
That's right, ..but you can't expect to guess what it is until you try it ... that was what i meant, Fixed ... Thanks
– Jans
Nov 22 at 16:29
add a comment |
up vote
3
down vote
accepted
up vote
3
down vote
accepted
In std::unordered_map
the bucket for a particular element is completely determined by the hash value computed on the key, std::unordered_map
use as the corresponding specialization of std::hash
as default hash function, which is implementation defined and is not even guaranteed to be the same throughout different program execution. see std::hash.
As @François Andrieux said in the comment section, order of iteration of std::unordered_map
is not specified, hence, you cannot expect the same iteration behavior in all machines, e.g the output in my computer is:
Element [de:Germany] is in bucket #0
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #4
Element [us:United States] is in bucket #4
In std::unordered_map
the bucket for a particular element is completely determined by the hash value computed on the key, std::unordered_map
use as the corresponding specialization of std::hash
as default hash function, which is implementation defined and is not even guaranteed to be the same throughout different program execution. see std::hash.
As @François Andrieux said in the comment section, order of iteration of std::unordered_map
is not specified, hence, you cannot expect the same iteration behavior in all machines, e.g the output in my computer is:
Element [de:Germany] is in bucket #0
Element [fr:France] is in bucket #3
Element [uk:United Kingdom] is in bucket #4
Element [us:United States] is in bucket #4
edited Nov 22 at 16:29
answered Nov 22 at 16:19
Jans
7,01922233
7,01922233
Look at my edit. My confusion is on why it is ordered in that way even though there is no comparison operator
– Michael Honaker
Nov 22 at 16:24
That's right, ..but you can't expect to guess what it is until you try it ... that was what i meant, Fixed ... Thanks
– Jans
Nov 22 at 16:29
add a comment |
Look at my edit. My confusion is on why it is ordered in that way even though there is no comparison operator
– Michael Honaker
Nov 22 at 16:24
That's right, ..but you can't expect to guess what it is until you try it ... that was what i meant, Fixed ... Thanks
– Jans
Nov 22 at 16:29
Look at my edit. My confusion is on why it is ordered in that way even though there is no comparison operator
– Michael Honaker
Nov 22 at 16:24
Look at my edit. My confusion is on why it is ordered in that way even though there is no comparison operator
– Michael Honaker
Nov 22 at 16:24
That's right, ..but you can't expect to guess what it is until you try it ... that was what i meant, Fixed ... Thanks
– Jans
Nov 22 at 16:29
That's right, ..but you can't expect to guess what it is until you try it ... that was what i meant, Fixed ... Thanks
– Jans
Nov 22 at 16:29
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53434552%2funordered-map-iterating-by-values%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Note that your output is also sorted by key type and also sequential by bucket, but starting at
#2
with modulo arithmetic.– François Andrieux
Nov 22 at 16:02
As far as I know, the order of elements when iterating over an
std::unordered_map
is unspecified. I understand why you might expect it to order them by bucket but I don't know of anything that guaranties it. Evidently that's not what's happening here.– François Andrieux
Nov 22 at 16:04
3
It's not clear what documentation you are referring to. The order of iterating over
unordered_map
is not specified so should not be given by any documentation.– François Andrieux
Nov 22 at 16:10
3
It's just a coincidence. I can reproduce with the specific keys you show, but change them to
"a"
,"b"
,"c"
, "d
" and the output is no longer sorted (either by key or by bucket). Unordered map is unordered.– Igor Tandetnik
Nov 22 at 16:13
1
@MichaelHonaker The bottom line is you cannot rely on
unordered_map
's ordering of elements. The order is unspecified, but it doesn't mean random. So even a strangely well ordered sequence can be a legitimate ordering.– François Andrieux
Nov 22 at 16:30