I have the below snippet of code (which you can run here: http://coliru.stacked-crooked.com/a/2f62134b5c125051)
#include <iostream>
#include <set>
#include <map>
int main()
{
std::set<std::pair<const int, const int>> const mySet{{0,0}}; // value_type = std::pair<const int, const int>
for (std::set<std::pair<const int, const int>>::iterator it = mySet.cbegin(); it != mySet.cend(); ++it)
{
std::cout<<"set it = " << it->first << " " << it->second << std::endl;
}
std::map<const int, const int> const myMap{{0,0}}; // value_type = std::pair<const int, const int>
for (std::map<const int, const int>::iterator it = myMap.cbegin(); it != myMap.cend(); ++it)
{
std::cout<<"map it = " << it->first << " " << it->second << std::endl;
}
}
Can someone please explain me why for std::set the below does not throw any error:
std::set<std::pair<const int, const int>>::iterator it = mySet.cbegin();
while for std::map the below throws error (no known conversion from _Rb_tree_const_iterator<std::pair<const int, const int> > to _Rb_tree_iterator<std::pair<const int, const int> >) as expected:
std::map<const int, const int>::iterator it = myMap.cbegin();
How does it work for std::set? Shouldn't assigning a const_iterator to an iterator always throw an error?
In practice std::set<T>::iterator is the same as std::set<T>::const_iterator because std::set's elements are immutable. It does not have a mutable iterator type.
This is not the case for std::map which is why you observe different behavior.
From the C++ 17 Standard (26.2.6 Associative containers)
6 iterator of an associative container is of the bidirectional iterator category. For associative containers where the value type is the same as the key type, both iterator and const_iterator are constant iterators. It is unspecified whether or not iterator and const_iterator are the same type.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With