首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用auto获取const_iterator?

如何使用auto获取const_iterator?
EN

Stack Overflow用户
提问于 2013-03-06 04:12:49
回答 6查看 27.4K关注 0票数 65

第一个问题:是否可以使用auto“强制”const_iterator?例如:

代码语言:javascript
复制
map<int> usa;
//...init usa
auto city_it = usa.find("New York");

我只想查询,而不是更改city_it所指向的任何内容,所以我希望city_itmap<int>::const_iterator。但是通过使用auto,city_itmap::find()的返回类型是相同的,即map<int>::iterator。有什么建议吗?

EN

回答 6

Stack Overflow用户

发布于 2017-07-12 20:21:28

由于使用了C++17,您可以像这样使用std::as_const

代码语言:javascript
复制
#include <utility>

// ...

auto city_it = std::as_const(usa).find("New York");
票数 23
EN

Stack Overflow用户

发布于 2013-03-06 05:07:12

与@Jollymorphic的答案相比,这并不是对转换为const的截然不同的看法,但我认为拥有一个像这样的实用单行函数是很方便的:

代码语言:javascript
复制
template<class T> T const& constant(T& v){ return v; }

这使得转换更加吸引人的眼睛:

代码语言:javascript
复制
auto it = constant(usa).find("New York");
// other solutions for direct lengths comparision
std::map<std::string, int>::const_iterator city_it = usa.find("New York");
auto city_it = const_cast<const std::map<std::string, int>&>(usa).find("New York");

嗯,我想说,越大并不总是越好。当然,您可以根据自己的喜好来选择函数的名称-- as_constconst_是可能的选择。

票数 12
EN

Stack Overflow用户

发布于 2013-03-13 00:57:37

另一个使用auto的变体(同时保留可变usa和常量usa):

代码语言:javascript
复制
map<std::string, int> usa;
//...init usa
const auto &const_usa = usa;
auto city_it = const_usa.find("New York");

如果在初始化后根本不需要map是可变的,那么还有一些其他的选择。

您可以将usa定义为const并使用函数调用对其进行初始化:

代码语言:javascript
复制
const map<std::string, int> usa = init_usa();
auto city_it = usa.find("New York");

或者使用lambda初始化const映射:

代码语言:javascript
复制
const auto usa = [&]()->const map<std::string, int> 
   {
   map<std::string, int> usa;
   //...init usa
   return usa;
   }();
auto city_it = usa.find("New York");
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15233188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档