【发布时间】:2015-04-11 13:07:44
【问题描述】:
考虑以下代码示例:
#include<iostream>
#include<vector>
#include<typeinfo>
int main(){
std::vector<int> v = {1 ,2,4};
for(auto &i:v) std::cout<<typeid(i).name();
for(auto k = v.begin(); k!=v.end();++k) std::cout<<typeid(k).name();
return 0;
}
第一个循环表示基于范围的 for 循环,第二个循环是带有迭代器的常规 for 循环。我经常使用常规循环,根据我的经验,auto k 是迭代器类型,而基于范围的循环的类型是 auto i 作为 int。上述程序的输出是:
i & N9__gnu_cxx17__normal_iteratorIPiSt6vectorIiSaIiEEEE
对于像向量这样的集合(在某处提到)上基于范围的循环,这是正常的行为吗?因为有人(比如我)会假设基于范围的 for 循环只是常规 for 循环的简写。
【问题讨论】:
-
这是设计的。基于范围的
for循环为您提供了元素。这是一个足够好的答案吗? -
必须有理由将它们设计成这样,我看不到。有参考吗?
-
请注意,这两个循环并不完全等效:您的显式基于范围的循环每次都会评估
end(),因此可以适应向量的结构变化(只要它们不失效k)。基于范围的循环仅在开始时评估end(),因此您最好将向量的结构单独留在内部。因此,没有为您提供更改该结构的方法(即迭代器),而仅提供访问/更改值的方法是有道理的。 -
@celtschk 感谢您的洞察力:)。我当然不知道。
-
typeid::name 返回值是实现定义的。 stackoverflow.com/questions/4465872/…