首页 > 解决方案 > 将 const_iterator 分配给迭代器

问题描述

我有以下代码片段(您可以在此处运行: 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;
    }   
}

有人可以解释一下为什么std::set下面不会抛出任何错误:

std::set<std::pair<const int, const int>>::iterator it  = mySet.cbegin();

而对于std::map以下抛出错误(没有已知的从_Rb_tree_const_iterator<std::pair<const int, const int> >_Rb_tree_iterator<std::pair<const int, const int> >的转换):

std::map<const int, const int>::iterator it  = myMap.cbegin();

它对std::set有何作用?将const_iterator分配给迭代器不应该总是抛出错误吗?

标签: c++c++11iteratorsetconst-iterator

解决方案


实际上std::set<T>::iterator是一样的,std::set<T>::const_iterator因为std::set's 的元素是不可变的。它没有可变的迭代器类型。

情况并非如此,std::map这就是您观察到不同行为的原因。


推荐阅读