当我查看不同STL对象和函数的标准时,有一点对我没有意义的是为什么容器对象的begin()和end()函数按值返回迭代器而不是通过不断的参考?在我看来,迭代器可以在内部由容器对象保持,并在容器发生变异时进行调整。这样可以降低在for循环中创建不必要的临时代码的成本:
for (std::vector<int>::iterator it=my_vec.begin(); it!=my_vec.end(); ++it){
//do things
}
这是一个有效的问题吗?有没有什么关于使用迭代器的引用,这是一个坏主意?大多数编译器实现无论如何都会优化这个问题吗?
答案 0 :(得分:4)
迭代器的设计重量轻,可复制(可分配)。例如,对于向量,迭代器可能只是一个指针。此外,迭代器的重点是将算法与容器分离,因此容器不应该关心其他任何人当前持有的迭代器
答案 1 :(得分:4)
如果begin
和end
方法返回引用,则容器将被强制将每个迭代器作为成员。标准人们试图尽可能地为实现留下灵活性。
例如,您可以为数组创建一个简单的包装器,该数组作为标准容器,不消耗任何额外的内存。如果要求这个包装器包含迭代器,它将不再那么简单或小。
答案 2 :(得分:0)
好吧,如果选择正确的迭代器,STL会: - )
for (
std::vector<int>::const_iterator it=my_vec.begin(),
end=my_vec.end();
it!=end;
++it)
{
//do things
}
STL中的迭代器具有指针语义。 const迭代器具有const指针语义。