使用指针作为容器迭代器违反标准

时间:2017-01-25 13:38:11

标签: c++ pointers vector iterator random-access

Angew made a comment vector使用原始指针作为它的迭代器类型是好的。这有点让我陷入困境。

我开始研究它,发现对vector迭代器的要求只是它们"Random Access Iterators",明确指出指针符合条件:

  

指向数组元素的指针满足所有要求

编译器甚至为vector提供迭代器以进行调试的唯一原因是,还是我在vector上错过了一个要求?

3 个答案:

答案 0 :(得分:3)

  

§24.2.1

     

由于迭代器是指针的抽象,因此它们的语义是大多数语义的概括。   C ++中的指针。这确保了每个带迭代器的函数模板都能正常工作   常规指针。

所以是的,使用指针满足Random Access Iterator的所有要求。

std::vector可能出于某些原因提供迭代器

  1. 标准说它应该。

  2. 如果std::mapstd::set等容器提供迭代器而std::vector仅提供value_type*指针,则会很奇怪。迭代器提供容器库的一致性。

  3. 它允许矢量类型的特化,例如std::vector<bool>,其中value_type*指针不是有效的迭代器。

答案 1 :(得分:2)

我的50美分:

迭代器是访问任何 STL容器的通用方法。我觉得你说的是:由于指针可以替代向量的迭代器,为什么有向量的迭代器?

那么,谁说你不能在C ++中重复一遍?实际上,为同一功能提供不同的接口是一件好事。这应该不是问题。

另一方面,考虑具有使用迭代器的算法的库。如果向量没有迭代器,那只是对异常的邀请(因为语言中的异常,而不是编程意义)。每次必须编写算法时,他必须为带有指针的向量做一些不同的事情。但为什么?这没有理由这么麻烦。只需以相同的方式连接所有内容。

答案 2 :(得分:2)

这些评论的意思是

template <typename T, ...>
class vector
{
public:
    typedef T* iterator;
    typedef const T* const_iterator;
    ...
private:
    T* elems; // pointer to dynamic array
    size_t count;
    ...
}

有效。同样,用于std::算法的用户定义容器也可以做到这一点。然后,当模板要求Container::iterator该实例化时,> 的类型为T*,并且行为正常。

因此,该标准要求vector具有vector::iterator的定义,并在代码中使用该定义。在一个平台上,它被实现为指向数组的指针,但在不同的平台上,它是另一个平台。重要的是,这些事情在标准指定的所有方面都表现相同。