关闭

C++11关键字auto如何得到const迭代器

523人阅读 评论(0) 收藏 举报
分类:

auto给C++11的变量定义带来了很多方便,最主要的我认为就是迭代器的使用了

auto之前的 方法通常是typedef一个容器类型,然后以此类型名再得到迭代器类型。

auto则非常简便:

int main()
{
      std::map<int, std::string> map;
      map[1] = "hello world";
      auto iter = map.find(1);
      printf("%s", iter->second.c_str());
      return 0;
}

但是,迭代器分为const和非const迭代器,上述代码中auto得到的究竟是什么样的迭代器呢?编译器是如何推导出来的呢?

答案是:编译器的推导是按照容器是否const来进行的,如果容器是一个const变量,那么也只能调用返回const迭代器的find,自然就会得到const迭代器,否则就会得到非const类型的迭代器。

那么,如果希望得到一个const迭代器,则需要将容器也转换成const类型,例如下面的办法:

template<typename T>
const T& const_(const T& obj)
{
      return obj;
}

int main()
{
      std::map<int, std::string> map;
      map[1] = "hello world";
      auto iter = const_(map).find(1);
      iter->second = "hey world"; // 错误,无法编译通过,因为iter是一个const迭代器
      return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:330122次
    • 积分:3541
    • 等级:
    • 排名:第9304名
    • 原创:74篇
    • 转载:37篇
    • 译文:0篇
    • 评论:76条
    好站链接
    尤龙同学的代码与诗歌