我如何获得一个const_iterator使用自动?
第一个问题:是否有可能“强制”一个const_iterator
使用自动? 例如:
map<int> usa; //...init usa auto city_it = usa.find("New York");
我只是想查询,而不是改变city_it
指出的任何东西,所以我想有city_it
是map<int>::const_iterator
。 但是通过使用auto, city_it
和map::find()
的返回types是一样的,它是map<int>::iterator
。 任何build议?
对不起,但我只是觉得最好的build议是根本不使用auto
,因为你想执行(隐式有效) types转换 。 auto
是为了推断确切的types ,这不是你想要的。
只要这样写:
std::map<std::string, int>::const_iterator city_it = usa.find("New York");
正如MooingDuck指出的那样,使用types别名可以提高代码的可读性和可维护性:
typedef std::map<std::string, int> my_map; my_map::const_iterator city_it = usa.find("New York");
与@ Jollymorphic的答案相比,这不是一个完全不同的转换为const
的方法,但是我认为有这样一个实用的单线程函数是很方便的:
template<class T> T const& constant(T& v){ return v; }
这使得转换更吸引眼球:
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");
那么,我会说,更大并不总是更好。 你当然可以根据你的喜好select函数的名字 – as_const
或者const_
是可能的select。
使用auto的另一个变体(保持可变的美国和常量美国):
map<std::string, int> usa; //...init usa const auto &const_usa = usa; auto city_it = const_usa.find("New York");
如果init之后不需要映射是可变的,还有一些其他选项。
您可以将usa定义为const,并使用函数调用来初始化它:
const map<std::string, int> usa = init_usa(); auto city_it = usa.find("New York");
或者使用lambda来初始化一个常量映射:
const auto usa = [&]()->const map<std::string, int> { map<std::string, int> usa; //...init usa return usa; }(); auto city_it = usa.find("New York");
一个干净的解决scheme是使用一个const引用到另外可修改的映射:
const auto &const_usa = usa; auto city_it = const_usa.find("New York");
这将确保你不能修改const_usa
,并使用const迭代器。
我现在无法testing这个function,但是我认为它可以做到这一点:
auto city_it = const_cast< const map<int> & >(usa).find("New York");
既然C ++ 17可以像这样使用std::as_const
:
#include <utility> // ... auto city_it = std::as_const(usa).find("New York");
你可以使用自动“追踪”一个types或“推导”一个types: // deduce auto city_it = usa.find("New York");
// track auto city_it = std::map<int>::const_iterator( usa.find("New York"));
此外,手表是由Herb Sutter的现代c ++风格的谈话,涵盖了大部分这些types的扣除指导。 https://youtu.be/xnqTKD8uD64