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

时间:2017-12-16 11:26:33

标签: 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)

那么,它隐含在这里发生了类型转换?

3 个答案:

答案 0 :(得分:2)

  

那么,它隐含在这里发生了类型转换?

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

标准容器迭代器实现和指针允许对它们应用相同的操作(public func castSafely<T>(_ object: Any, expectedType: T.Type) -> T { guard let typedObject = object as? T else { fatalError("Expected object: \(object) to be of type: \(expectedType)") } return typedObject } class AnalysisViewController: UIViewController { var analysisView: AnalysisView { return castSafely(self.view, expectedType: AnalysisView.self) } override func loadView() { view = AnalysisView() } } ++--,...)。

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

答案 1 :(得分: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 ++的指针的泛化   程序使用不同的数据结构(容器)   统一的方式......

答案 2 :(得分:1)

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

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

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

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