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

原创 2016年11月16日 14:32:23

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;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

std::vector的几种遍历方式比较

std::vector是我在标准库中实用最pi

【C++】:STL迭代器使用详解,很好很详细

写在前面,迭代器这种东西,就是为了使访问简单!! 容器::iterator iter; for(iter= 容器.begin();iter!=容易.end();iter++){ coutfirst等等...

论迭代器和auto的效率问题

1、遍历一个容器,大家一般会这么写;(用迭代器遍历) #include  #include  int main(){ std::vectorint> vec;  for(vectorin...

【使用CMake组织C++工程】3:CMake 函数和宏

这篇文章分享一下CMake中函数:function, 和宏:macro的使用。本文先从二者区别说起,由于二者区别很小,所以后文就仅对函数的用法进行讨论,因为函数有作用域的概念,适用范围更广。后文分享一...
  • elloop
  • elloop
  • 2016-04-12 09:26
  • 3447

依赖名称不是类型[关于模板类中的迭代器]

今天在封装STL时候遇到了这么一个问题 template class MyList { public: typedef std::list::iterator iterator; }; 当我想这...

mark一个搜索相关技术的博客

http://www.searchtb.com/

HOG+SVM 自己制作训练样本+训练分类器

最近在做行人检测的项目,其中用到了HOG+SVM,SVM分类器用的是opencv自己提供的,但对于具体应用,该分类器可能并不适用。因此想到制作训练样本,并训练SVM分类器。       步骤如下: ...

CMAKE的使用

Normal 0 7.8 磅 0 2 false false false MicrosoftIn...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)