我想知道,
for(std::map<int, double, std::greater<int> >::iterator it = mymap.begin(); it != mymap.end(); ++it)
{
//do stuff
}
为什么我无法将其写为:
for(mymap::iterator it = mymap.begin(); it != mymap.end(); ++it)
{
//do stuff
}
当然,对地图进行类型设置会使第一个代码更简洁 - 但这不是我的观点。编译器知道mymap
的类型,那么为什么不让它解析mymap::iterator
?是否有理由无法通过实例访问iterator
?
答案 0 :(得分:12)
::
是一个范围解析运算符,它在左侧需要类型名称或命名空间名称。它不接受左侧的对象名称。允许这可能会使语言中的许多内容过于复杂。
事实上,如果允许这样的事情,可能会将此功能附加到.
运算符,因为.
运算符是与LHS上的对象一起使用的运算符
for (mymap.iterator it = mymap.begin(); it != mymap.end(); ++it)
但无论如何,这仍然会使事情过于复杂化。
在未来的C ++标准中,通过decltype
关键字
for (decltype(mymap)::iterator it = mymap.begin(); it != mymap.end(); ++it)
P.S。根据维基百科关于decltype
的文章,它在合格ID中的可用性是一个有争议的问题。如果我理解正确,这种用法最终会被投票。
P.P.S。另外,正如@Asha在评论中指出的那样,在将来的C ++中,你将能够避免命名类型
for (auto it = mymap.begin(); it != mymap.end(); ++it)
答案 1 :(得分:1)
迭代器是一种在地图范围内定义的类型,而不是从地图创建的对象的一部分。