首页 文章

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

提问于
浏览
3

当我查看不同STL对象和函数的标准时,对我来说没有意义的一件事是为什么容器对象的begin()和end()函数按值而不是通过常量引用返回迭代器?在我看来,迭代器可以在内部由容器对象保持,并在容器发生变异时进行调整 . 这将减少在for循环中创建不必要的临时代码的成本,如下所示:

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

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

3 回答

  • 0

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

  • 4

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

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

  • 4

    好吧,如果你选择正确的迭代器,STL会:-)

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

    STL中的迭代器具有指针语义 . const迭代器具有const指针语义 .

相关问题