67

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

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

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

4

8 回答 8

40

抱歉,但我只是认为最好的建议是根本不使用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");
于 2013-03-05T20:20:25.800 回答
24

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

#include <utility>

// ...

auto city_it = std::as_const(usa).find("New York");
于 2017-07-12T12:21:27.853 回答
13

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

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

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

于 2016-03-14T09:45:58.493 回答
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_const或者只是const_可能的替代方案。

于 2013-03-05T21:07:12.127 回答
6

另一个使用 auto 的变体(同时保留一个 mutable usa 和一个 const usa):

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");
于 2013-03-12T16:57:36.867 回答
5

在 C++11 中,您可以这样做:

decltype(usa)::const_iterator city_it = usa.find("New York");
于 2018-10-17T22:44:25.260 回答
1

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

auto city_it = const_cast< const map<int> & >(usa).find("New York");
于 2013-03-05T20:15:45.717 回答
-3

您可以使用 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

于 2015-09-11T01:33:57.557 回答