我可以使用for循环范围来访问实际的迭代器而不是容器的value_type吗?
我想要做的示例代码(不编译,因为x是对):
#include <iostream>
#include <map>
using namespace std;
std::map<int, float> v;
int main()
{
for(auto x : v)
cout<<x->first<<", "<<x->second<<endl;
return 0;
}
答案 0 :(得分:3)
不,基于范围的for循环从迭代器中抽象出来。不过,在您的情况下,您只需将->
更改为.
:
for(auto x : v)
cout<<x.first<<", "<<x.second<<endl;
存在基于范围的for
循环,因此您不必处理迭代器。如果你确实需要迭代器,你必须手动编写循环,但实际代码不会那么长:
for (auto it = begin(v), ite = end(v); it != ite; ++it)
//loop body
答案 1 :(得分:0)
是的,使用适当的容器适配器包装迭代器,使operator*()
返回迭代器而不是值。
我认为提升带有这样的包装。
也许不是。但我确实在SO上找到了一个:https://stackoverflow.com/a/14920606/103167
事实上,正如Xeo观察到的那样,它可以用Boost完成,因为counting_range
执行算术,它对迭代器起作用就像整数一样好:
for (auto it : boost::counting_range(v.begin(), v.end()))