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

Does Using a Pointer as a Container Iterator Violate the Standard

vector 使用原始指针作为迭代器类型很好。那有点让我陷入困境。

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

A pointer to an element of an array satisfies all requirements

编译器甚至为 vector 提供迭代器用于调试目的的唯一原因,还是实际上我错过了 vector 的要求?

我的 50 美分:

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

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

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

§ 24.2.1

Since iterators are an abstraction of pointers, their semantics is a generalization of most of the semantics of pointers in C++. This ensures that every function template that takes iterators works as well with regular pointers.

所以是的,使用指针满足 Random Access Iterator.

的所有要求

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

  1. 标准说应该。

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

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

这些评论说的是

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 的定义,并且您在代码中使用它。在一个平台上,它被实现为指向数组的指针,但在不同的平台上它是另一回事。重要的是,这些东西在标准指定的所有方面都以相同的方式表现。