微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将const_iterator分配给迭代器

如何解决将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,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 > _Rb_tree_iterator > )符合预期:

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

它对 std :: set 如何起作用?不应该将 const_iterator 分配给 iterator 总是抛出错误吗?

解决方法

实际上,std::set<T>::iteratorstd::set<T>::const_iterator相同,因为std::set的元素是不可变的。它没有可变的迭代器类型。

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

,

来自C ++ 17标准(26.2.6关联容器)

关联容器的

6迭代器是双向的 迭代器类别。 对于值类型为的关联容器 与键类型相同,迭代器和const_iterator均为 常量迭代器。不确定迭代器和 const_iterator是同一类型。

,

您不能修改set元素。键必须为const,以确保set所承诺的不变:元素是经过排序且唯一的。 map元素也已排序,但是您可以修改元素的映射值(键也为const)。 std::map<A,B>的元素是std::pair<const A,B>

cppreference上,您可以看到std::set的迭代器的成员别名为

iterator常数LegacyBidirectionalIterator

const_iterator常数LegacyBidirectionalIterator

它们都是常量迭代器。

另一方面,对于std::map,它们是:

iterator LegacyBidirectionalIterator

const_iterator常数LegacyBidirectionalIterator

const_iterator分配给非常量是错误的。就像尝试通过将指向const的指针分配给指向非const的指针来抛弃const一样。这将无法工作,因为您无法制作无法修改的东西。那会破坏const正确性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?