c++ - 将 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分配给迭代器不应该总是抛出错误吗?
解决方案
实际上std::set<T>::iterator
是一样的,std::set<T>::const_iterator
因为std::set
's 的元素是不可变的。它没有可变的迭代器类型。
情况并非如此,std::map
这就是您观察到不同行为的原因。
推荐阅读
- css - CSS 列表项垂直对齐
- javascript - 您如何在 Stripe 结账时将客户链接到订阅?
- microsoft-graph-api - 如何访问共享点库中的自定义列 - 图形 API
- sql - 在 SQL Server 和 Postgresql 中将 CASE 用于类似枢轴的函数
- javascript - 返回 html 字符串并将其插入到 title 属性时正确处理通过 JSON 发送的文本
- ruby-on-rails - 成功上传多个图像和如下格式后,如何从carrierwave获取这些网址?
- git - git-rebase 删除文件,但痕迹保留在 git-rev-list
- python - 将文件输入的行读入Python中的多个列表
- php - 在数据库中找不到记录
- google-apps-script - 有没有可以写在谷歌表格中的脚本,可以“复制到剪贴板”?