Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Assigning a const_iterator to an iterator

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?

like image 555
Varun Hiremath Avatar asked May 19 '26 11:05

Varun Hiremath


2 Answers

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.

like image 111
François Andrieux Avatar answered May 21 '26 00:05

François Andrieux


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.

like image 23
Vlad from Moscow Avatar answered May 20 '26 23:05

Vlad from Moscow