在不键入整个容器定义的情况下,有效地引用迭代器的类型名称?

时间:2013-02-07 11:52:55

标签: c++ boost containers boost-iterators

与键入

相比,是否有更有效的方式来引用容器迭代器的类型名称
std::unordered_map<keyclass, valueclass>::iterator 

每次我需要迭代器?

当然,有

typedef boost::unordered_map<keyclass, valueclass>::iterator classitr

但是为每个容器引入typedef并不会让我觉得它是非常易读的代码。 对C ++不熟悉,并假设一个人通常对他们想要使用的容器有一个引用 - 是否有类似的东西

Container<KeyClass, ValueClass> x;

x::iterator_type i

或我遗失的任何其他明显的捷径?

2 个答案:

答案 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();