与键入
相比,是否有更有效的方式来引用容器迭代器的类型名称std::unordered_map<keyclass, valueclass>::iterator
每次我需要迭代器?
当然,有
typedef boost::unordered_map<keyclass, valueclass>::iterator classitr
但是为每个容器引入typedef并不会让我觉得它是非常易读的代码。 对C ++不熟悉,并假设一个人通常对他们想要使用的容器有一个引用 - 是否有类似的东西
Container<KeyClass, ValueClass> x;
x::iterator_type i
或我遗失的任何其他明显的捷径?
答案 0 :(得分:3)
这是C ++ 11引入auto
关键字新含义的原因之一:
auto it = vec.begin();
编译器将以类似于模板类型推导的方式从初始化程序中计算出it
的类型。
Pre-C ++ 11,通常的方法是按照你的建议使用typedef
。它通常对typedef
容器最有用,然后给出与之相关的所有内容:
typedef std::unordered_map<key, value> map;
map m;
map::iterator = m.begin();
您可以为typedef
提供一个更有意义的名称,该名称准确描述了map
的类型phone_map
。例如,如果您有从名称到电话号码的地图,则可以将其称为phone_map::iterator
,迭代器将为auto
。
{{1}}也是完美转发的有用工具
答案 1 :(得分:2)
在C ++ 11中,您可以使用decltype
从变量中获取类型。
写:
std::unordered_map<keyclass, valueclass> m;
decltype(m)::iterator it = m.begin();
当然,如果您使用的是C ++ 1,那么您也可以写:
std::unordered_map<keyclass, valueclass> m;
auto it = m.begin();