I am looking for a way to iterate through the keys of a map in C++ 17. The way that I have in mind right now is based on the answer of thisquestion , the way is presented below.
for (auto const& [i, val] : myMap)
...
However, I do not need to use the value val
, I just need the value i
. Therefore, the piece of code ...
does not contain any call to the value val
. Consequently, whenever I compile the code, the following warning message appears:
warning: unused variable ‘val’ [-Wunused-variable]
for (auto const& [i, val] : myMap){
^
What I want is to find a way to iterate through (only) the keys of the map, ignoring the values. Does anyone have any idea how to do it?
Two options:
A ranged-for version of @πάνταῥεῖ 's answer :
for (auto const& pair : myMap) { auto key = pair.first; // etc. etc. }
Use the ranges-v3 library (or std::ranges
in C++20) to adapt the range myMap.begin()
and myMap.end()
by projecting it onto its first coordinate. Then you'd write something like:
for (auto key : keys_of(myMap) ) { // etc. etc. }
you can do this without ranges if keys_of()
materializes all of the keys, but that could be expensive for a larger map.
(If you have weird, heavy keys, then const auto& key
instead of auto key
.)
Does anyone have any idea how to do it?
Sure! You can just use a traditional for
loop with an iterator:
for(auto it = myMap.begin(); it != myMap.end(); ++it) {
auto i = it->first;
// ...
}
How about using Go -like unused variable declaration with _
:
for(auto const& [i, _] : myMap)
...
You can avoid the unused warnings by casting to void
:
for (auto const& [key, val] : m) {
(void)val; // To avoid unused warnings
// use key
}
for(auto const & pair : myMap) since map internally stored element in std::pair format, hence you can access the element by writing, pair.first; for key or pair.second; for value.
for (auto& [key, std::ignore] : m) {
// use key
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.