就能够执行手头任务而言,它们的效果都相同。毕竟,它们都提供了一个符合迭代器要求的对象,并且你使用它们指向同一个
vector
的元素。然而,我会选择
vector<int>::iterator
这个选项,因为这种类型在表达我们打算如何使用它方面更具表现力。
裸指针类型
int*
并没有告诉你
p
到底是什么,除了它存储了一个
int
的地址。如果你单独考虑
p
,它的类型并没有告诉你很多关于它如何使用的信息。选用
vector<int>::pointer
也有同样的问题——它只表达了它所指向的对象类型是一个 vector 的元素类型。实际上,它无需指向
vector
中的任何元素。
另一方面,
vector<int>::iterator
告诉你所有需要知道的内容。它明确说明这个对象是一个迭代器,同时该迭代器被用来指向
vector<int>
中的元素。
此外,如果你不得不改变容器类型,这种方式更易于维护。例如,如果你改为使用
std::list
,指针类型就无法继续使用了,因为元素不再以连续的数组方式存储。而容器的
iterator
类型总是提供一种可用于迭代其元素的类型。
当我们有了 Concepts 后,我希望最佳实践能够是这样的:
ForwardIteratorOf<int> it = std::begin(v)
如果你所想象的存在 ForwardIteratorOf<int>
被更改为最能描述你对 it
意图的概念。如果元素类型不重要,则可以只用 ForwardIterator
(或者 BidirectionalIterator
, RandomAccessIterator
或其他)。
v[0]
。 - user1129665vector::front
函数。 - Ryan Haining