在 Herb Sutter'sWhen Is a Container Not a Container?
中,他展示了一个将指针放入容器的示例:
// Example 1: Is this code valid? safe? good?
//
vector<char> v;
// ...
char* p = &v[0];
// ... do something with *p ...
然后用“改进”跟进它:
// Example 1(b): An improvement
// (when it's possible)
//
vector<char> v;
// ...
vector<char>::iterator i = v.begin();
// ... do something with *i ...
但并没有真正提供一个令人信服的论点:
一般来说,当您想要指向容器内的对象时,更喜欢使用迭代器而不是指针并不是一个糟糕的指导方针。毕竟,迭代器在与指针几乎相同的时间和相同的方式下失效,迭代器存在的一个原因是提供一种“指向”包含对象的方法。所以,如果你有选择的话,更喜欢在容器中使用迭代器。
不幸的是,使用迭代器并不能总是获得与使用指向容器的指针相同的效果。迭代器方法有两个主要的潜在缺点,当任何一个适用时,我们都必须继续使用指针:
您不能总是方便地使用可以使用指针的迭代器。(见下面的例子。)
在迭代器是一个对象而不仅仅是一个光秃秃的指针的情况下,使用迭代器可能会产生额外的空间和性能开销。
在向量的情况下,迭代器只是一个 RandomAccessIterator。出于所有意图和目的,这是对指针的薄包装。一种实现甚至承认这一点:
// This iterator adapter is 'normal' in the sense that it does not
// change the semantics of any of the operators of its iterator
// parameter. Its primary purpose is to convert an iterator that is
// not a class, e.g. a pointer, into an iterator that is a class.
// The _Container parameter exists solely so that different containers
// using this template can instantiate different types, even if the
// _Iterator parameter is the same.
_Iterator
此外,该实现存储类型为pointer
or的成员值T*
。换句话说,只是一个指针。此外,difference_type
这种类型的 isstd::ptrdiff_t
和定义的操作只是简单的包装器(即operator++
is ++_pointer
、operator*
is *_pointer
)等等。
按照 Sutter 的论点,这个迭代器类对指针没有任何好处,只有缺点。我对么?