如何使用auto获取const_iterator?

时间:2013-03-05 20:12:49

标签: c++ c++11 auto

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

map<int> usa;
//...init usa
auto city_it = usa.find("New York");

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

8 个答案:

答案 0 :(得分:34)

很抱歉,但我认为最好使用auto ,因为您想要执行(隐式有效)类型转换auto用于推断确切类型,这不是您想要的。

只需这样写:

std::map<std::string, int>::const_iterator city_it = usa.find("New York");

正如MooingDuck正确指出的那样,使用类型别名可以提高代码的可读性和可维护性:

typedef std::map<std::string, int> my_map;
my_map::const_iterator city_it = usa.find("New York");

答案 1 :(得分:12)

与@ 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");

嗯,我会说,更大并不总是更好。您当然可以根据自己的偏好选择功能名称 - as_constconst_只是可能的选择。

答案 2 :(得分:6)

使用auto的另一种变体(保持可变的美国和const美国):

map<std::string, int> usa;
//...init usa
const auto &const_usa = usa;
auto city_it = const_usa.find("New York");

如果您在初始化后根本不需要地图可变,那么还有其他一些选项。

你可以将usa定义为const并使用函数调用来启动它:

const map<std::string, int> usa = init_usa();
auto city_it = usa.find("New York");

或使用lambda初始化const映射:

const auto usa = [&]()->const map<std::string, int> 
   {
   map<std::string, int> usa;
   //...init usa
   return usa;
   }();
auto city_it = usa.find("New York");

答案 3 :(得分:6)

一个干净的解决方案是使用 const 引用其他可修改的地图:

const auto &const_usa = usa;
auto city_it = const_usa.find("New York");

这将确保您无法修改const_usa,并将使用const迭代器。

答案 4 :(得分:5)

从C ++ 17开始,您可以像这样使用std::as_const

SELECT A.ID, A.place, A.receipt, D.State, A.service, B.Description,  C.ID, C.receipt, C.Source
FROM B, (A LEFT JOIN C ON A.receipt = C.receipt), D;

答案 5 :(得分:1)

我现在无法对此进行测试,但我认为这样做可以解决问题:

auto city_it = const_cast< const map<int> & >(usa).find("New York");

答案 6 :(得分:0)

在C ++ 11中,您可以执行以下操作:

decltype(usa)::const_iterator city_it = usa.find("New York");

答案 7 :(得分:-2)

您可以使用auto来“跟踪”某种类型或“推断”某种类型: // deduce auto city_it = usa.find("New York");

// track auto city_it = std::map<int>::const_iterator( usa.find("New York"));

另外,Watch是Herb Sutter的现代c ++风格讲座,涵盖了大部分类型演绎指南。 https://youtu.be/xnqTKD8uD64