C++ 指针类型转换为迭代器吗?

C++ 指针类型转换为迭代器吗?,c++,vector,stl,iterator,C++,Vector,Stl,Iterator,我遇到了以下代码: int data[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; reverse(data+2, data+6); 当我检查反向功能的原型时,它: void reverse (BidirectionalIterator first, BidirectionalIterator last) 那么,这里发生了什么 那么,这里发生了什么 不可以。指针可以用作算法模板函数的迭代器,因为模板类型作为一个概念 标准容器迭代器实现和指针允许对

我遇到了以下代码:

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
,具有特定的属性,详细描述了需要支持哪些操作。

实际上,算法声明如下

template<class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last);
模板
无效反向(首先是双向运算符,最后是双向运算符);
所以它是一个模板函数。可以这样写

template<class T>
void reverse(T first, T last);
模板
无效反向(T优先,T最后);
模板参数的名称
BidirectionalIterator
用于表示提供的模板参数除了运算符++还有运算符--,还必须具有的用户。指针满足这个要求

作为迭代器,则(C++标准,27.2迭代器要求) 27.2.1一般情况)

1 <强>迭代器是指针的泛化<强>允许C++ 在一个数据库中使用不同数据结构(容器)的程序 统一的方式


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

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

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


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

那么,你没有注意到,
BidirectionalIterator
是一个模板参数吗?知道了,reverse是一个函数模板,所以它可以接受不同类型的参数,所以基本上函数重载发生在:),对吗?@pankajkushwaha,是的。但是为什么我们不作为模板函数调用函数应该得到call:reverse(arg1,arg2)?@pankajkushwaha该函数从函数参数推断模板参数。为什么我们不作为模板函数调用函数应该得到call:reverse(arg1,arg2)?@pankajkushwaha我不太理解你的问题。
data+2
的类型是
int*
。是的,我的意思是说为什么我们不这样反向调用函数(data+2,data+6),我的意思是示例中的函数调用中缺少模板类型。@pankajkushwaha我明白了。如果你愿意,你可以这样称呼它。这会奏效的。但是在调用模板函数时不需要指定模板参数,因为编译器会根据传递的函数参数类型推断模板参数。