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

问题描述 投票:-4回答:3

我遇到了以下代码:

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

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

void reverse (BidirectionalIterator first, BidirectionalIterator last)

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

c++ vector stl iterator
3个回答
2
投票

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

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

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


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


1
投票

实际上算法被声明为

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 ++程序以统一的方式处理不同的数据结构(容器)......


1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.