小编use*_*395的帖子

对于向量,为什么更喜欢迭代器而不是指针?

在Herb Sutter中When 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 ...
Run Code Online (Sandbox Code Playgroud)

然后跟着它"改进":

  // Example 1(b): An improvement
  //               (when it's possible)
  //
  vector<char> v;

  // ...

  vector<char>::iterator i = v.begin();

  // ... do something with *i ...
Run Code Online (Sandbox Code Playgroud)

但实际上并没有提供令人信服的论据:

一般来说,当你想指向一个容器内的对象时,更喜欢使用迭代器而不是指针并不是一个糟糕的指导.毕竟,迭代器在与指针大致相同的时间和相同的方式上无效,并且迭代器存在的一个原因是提供一种"指向"包含对象的方法.因此,如果您有选择,请更喜欢将迭代器用于容器中.

不幸的是,你不能总是得到与迭代器相同的效果,你可以使用指针到容器.迭代器方法有两个主要的潜在缺点,当适用时我们必须继续使用指针:

  1. 您不能总是方便地使用可以使用指针的迭代器.(见下面的例子.)

  2. 在迭代器是一个对象而不仅仅是一个光头指针的情况下,使用迭代器可能会产生额外的空间和性能开销.

在向量的情况下,迭代器只是一个RandomAccessIterator.对于所有意图和目的,这是指针上的薄包装.一种实现甚至承认这一点:

   // This iterator adapter is 'normal' in the sense that it does not …
Run Code Online (Sandbox Code Playgroud)

c++ pointers iterator vector gotw

22
推荐指数
3
解决办法
2435
查看次数

标签 统计

c++ ×1

gotw ×1

iterator ×1

pointers ×1

vector ×1