Angew made a comment vector
使用原始指针作为它的迭代器类型是好的。这有点让我陷入困境。
我开始研究它,发现对vector
迭代器的要求只是它们"Random Access Iterators",明确指出指针符合条件:
指向数组元素的指针满足所有要求
编译器甚至为vector
提供迭代器以进行调试的唯一原因是,还是我在vector
上错过了一个要求?
答案 0 :(得分:3)
§24.2.1
由于迭代器是指针的抽象,因此它们的语义是大多数语义的概括。 C ++中的指针。这确保了每个带迭代器的函数模板都能正常工作 常规指针。
所以是的,使用指针满足Random Access Iterator
的所有要求。
std::vector
可能出于某些原因提供迭代器
标准说它应该。
如果std::map
或std::set
等容器提供迭代器而std::vector
仅提供value_type*
指针,则会很奇怪。迭代器提供容器库的一致性。
它允许矢量类型的特化,例如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
的定义,并在代码中使用该定义。在一个平台上,它被实现为指向数组的指针,但在不同的平台上,它是另一个平台。重要的是,这些事情在标准指定的所有方面都表现相同。