我理解标准允许std::vector<int, A>
为不同的分配器A
提供相同类型的迭代器。这称为SCARY iterators。
现在问题是标准允许std::vector<int, A>::iterator
只是A::pointer
的typedef,因此它只是默认分配器的int*
?
或者是否有一些(隐含的)要求它是每个容器的单独类类型?如果没有这样的要求那么为什么所有主要实现(包括SCARY)都不使用这种方法?它可能会进一步减少编译器工作,但现在int*
和vector<>::iterator
上的重载代码将无法编译。
答案 0 :(得分:7)
RE
“标准允许
的typedefstd::vector<int, A>::iterator
只是A::pointer
据我所知,是的。但不是std::vector<bool, A>
,因为这是一个特殊化,其中解除引用的迭代器是一个代理对象,它访问所使用的任何表示,目的是每bool
支持一位。
答案 1 :(得分:5)
现在问题是标准允许
std::vector<int, A>::iterator
只是A::pointer
的typedef,从而使它只是默认分配器的int*
吗?
我认为不是任何实施。
24.2迭代器要求[iterator.requirements]
24.2.1一般[iterator.requirements.general]
11在以下各节中,
a
和b
表示X
或const X
类型的值,[...]24.2.7随机访问迭代器[random.access.iterators]
Expression | Return type | Operational | Assertion/note | | semantics | pre-/post-condition -----------+----------------+-------------+-------------------------------- [...] -----------+----------------+-------------+-------------------------------- a < b | contextually | b - a > 0 | < is a total ordering relation | convertible to | | | bool | |
请注意,与-
的早期要求不同,<
没有前提条件a
和b
是同一容器的迭代器。需要<
来形成任意迭代器的总排序关系。 <
不需要为任意指针形成总排序关系。虽然允许实现扩展原始指针类型的<
的定义以允许比较不相关的指针值,但是流行的当前实际实现不会这样做,因为这样的扩展会阻止一些优化机会。