为什么C ++ STL容器的开始和结束函数按值而不是常量引用返回迭代器?

时间:2013-02-26 19:38:29

标签: c++ optimization stl containers

当我查看不同STL对象和函数的标准时,有一点对我没有意义的是为什么容器对象的begin()和end()函数按值返回迭代器而不是通过不断的参考?在我看来,迭代器可以在内部由容器对象保持,并在容器发生变异时进行调整。这样可以降低在for循环中创建不必要的临时代码的成本:

for (std::vector<int>::iterator it=my_vec.begin(); it!=my_vec.end(); ++it){
    //do things
}

这是一个有效的问题吗?有没有什么关于使用迭代器的引用,这是一个坏主意?大多数编译器实现无论如何都会优化这个问题吗?

3 个答案:

答案 0 :(得分:4)

迭代器的设计重量轻,可复制(可分配)。例如,对于向量,迭代器可能只是一个指针。此外,迭代器的重点是算法与容器分离,因此容器不应该关心其他任何人当前持有的迭代器

答案 1 :(得分:4)

如果beginend方法返回引用,则容器将被强制将每个迭代器作为成员。标准人们试图尽可能地为实现留下灵活性。

例如,您可以为数组创建一个简单的包装器,该数组作为标准容器,不消耗任何额外的内存。如果要求这个包装器包含迭代器,它将不再那么简单或小。

答案 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指针语义。