是迭代器的指针类型转换吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是迭代器的指针类型转换吗?相关的知识,希望对你有一定的参考价值。

我遇到了以下代码:

int data[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; 
reverse(data+2, data+6);

当我检查反向功能的原型时,它:

void reverse (BidirectionalIterator first, BidirectionalIterator last)

那么,它隐含的类型转换在这里吗?

答案

那么,它隐含的类型转换在这里吗?

否。指针可用作算法模板函数的迭代器,因为模板类型充当概念。

标准容器迭代器实现和指针允许对它们应用相同的操作(++--*->,...)。


值得注意的是,像BidirectionalIterator这样的模板参数类型具有某些std::iterator_traits,它详细描述了需要支持哪些操作。

另一答案

实际上算法被声明为

template<class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last);

所以它是一个模板功能。它可以写成

template<class T>
void reverse(T first, T last);

模板参数的名称BidirectionalIterator用于表示用户提供的模板参数必须与operator ++ also运算符分开。指针满足这一要求。

至于迭代器那么(C ++标准,27.2迭代器要求,27.2.1一般)

1迭代器是指针的泛化,允许C ++程序以统一的方式处理不同的数据结构(容器)......

另一答案

reverse的论点是模板化的。在语法上,参数可以具有任何类型,但算法将具有标准中指定的类型的要求。具体来说,它要求模板参数是双向迭代器。

如果类型满足标准中规定的Iterator概念的要求,则类型是迭代器。类似地,如果迭代器满足BidirectionalIterator的要求,它就是双向迭代器。

指针类型满足RandomAccessIterator的所有要求。因此指针是迭代器,更具体地说它们是随机访问迭代器。所有随机访问迭代器也是双向迭代器。

因此,不涉及转换,指针按原样使用。

以上是关于是迭代器的指针类型转换吗?的主要内容,如果未能解决你的问题,请参考以下文章

3.4 迭代器

C++ 的STL中,迭代器那个指针为何++能指向下一个元素?

基于指针的基本随机访问迭代器的代码?

struts 关于集合类型转换和迭代器的总结

STL 迭代器(iterator)详解

为啥 C++ 共享指针的行为不像迭代器的标准指针?