4

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

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

这是一个有效的担忧吗?是否有关于使用对迭代器的引用使这成为一个坏主意的东西?无论如何,大多数编译器实现都会优化这个问题吗?

4

3 回答 3

5

Iterators are designed to be light-weight and copyable (and assignable). For example, for a vector an iterator might literally just be a pointer. Moreover, the whole point of iterators is to decouple algorithms from containers, and so the container shouldn't have to care at all what kind of iterators anyone else is currently holding

于 2013-02-26T19:42:07.290 回答
5

如果beginandend方法返回一个引用,容器将被迫将每个迭代器作为成员。人们试图为实施留下尽可能多的灵活性。

例如,您可以为一个充当标准容器且不消耗任何额外内存的数组创建一个简单的包装器。如果这个包装器需要包含迭代器,它就不会那么简单或那么小了。

于 2013-02-26T19:57:13.300 回答
0

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

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

STL 中的迭代器具有指针语义。常量迭代器具有常量指针语义。

于 2013-02-26T19:58:10.940 回答