如何解决将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
std::map<const int,const int>::iterator it = myMap.cbegin();
它对 std :: set 如何起作用?不应该将 const_iterator 分配给 iterator 总是抛出错误吗?
解决方法
实际上,std::set<T>::iterator
与std::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 举报,一经查实,本站将立刻删除。