C++ 标准库定义了iterator和iterator_traits模板。看来一般来说,iterator_traits只是提取 中明确定义的属性iterator。如果iterator_traits要使用a则iterator直接使用对应的即可。T*如果需要某种类型的专门化(例如),则 的专门化iterator可以满足要求。这种间接的好处是什么?
eer*_*ika 12
一般来说, iterator_traits 似乎只是提取在迭代器中显式定义的属性。如果要使用iterator_traits,可以直接使用对应的iterator。
并非所有迭代器都可以输入别名作为成员。
这种间接的好处是什么?
让所有迭代器有一个统一的接口。更具体地说,指针也是迭代器,并且作为非类类型,指针不能具有成员。
因此,例如,当迭代器的用户想要回答“所指向的对象的类型是什么an_iterator_type”这个问题时,他们无法使用an_iterator_type::value_type,因为无法为所有迭代器(特别是指针)定义该类型。他们可以使用的是std::iterator_traits<an_iterator_type>::value_type可以为所有迭代器定义的 - 包括指针。这就是 的目的std::iterator_traits。
该标准定义了std::iterator_traits<T*>指针的专业化。尽管可以,但您不需要为自定义迭代器类型定义专门化,因为您可以将类型定义为成员,这些成员将由 的泛型定义使用std::iterator_traits。
的目的std::iterator是选择性地用作基类来帮助定义自定义迭代器的成员类型。然而,它的使用从来没有必要,它被认为是一个有缺陷的设计,并且长期以来不鼓励使用它。自 C++17 起,它已被弃用,并且可能会从未来的标准中删除。
一个希望能够说明设计问题的示例std::iterator:
// using the deprecated std::iterator
struct iterator : std::iterator<
std::input_iterator_tag, // OK so far
long, // can you guess what member this argument defines?
long, // how about this?
const long*, // you can probably guess this one
long> // still, no clue
{
...
// recommended way without using std::iterator
struct iterator
{
using iterator_category = std::input_iterator_tag;
using value_type = long;
using difference_type = long;
using pointer = const long*;
using reference = long;
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
783 次 |
| 最近记录: |