使用指针作为容器迭代器是否违反标准
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
可能出于某些原因提供迭代器
标准说应该。
如果 std::map
或 std::set
等容器提供迭代器而 std::vector
仅提供 value_type*
指针,那将很奇怪。迭代器提供跨容器库的一致性。
它允许向量类型的特殊化,例如,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
的定义,并且您在代码中使用它。在一个平台上,它被实现为指向数组的指针,但在不同的平台上它是另一回事。重要的是,这些东西在标准指定的所有方面都以相同的方式表现。
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
可能出于某些原因提供迭代器
标准说应该。
如果
std::map
或std::set
等容器提供迭代器而std::vector
仅提供value_type*
指针,那将很奇怪。迭代器提供跨容器库的一致性。它允许向量类型的特殊化,例如,
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
的定义,并且您在代码中使用它。在一个平台上,它被实现为指向数组的指针,但在不同的平台上它是另一回事。重要的是,这些东西在标准指定的所有方面都以相同的方式表现。