我遇到了以下代码:
int data[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 };
reverse(data+2, data+6);
当我检查反向功能的原型时,它的:
void reverse (BidirectionalIterator first, BidirectionalIterator last)
那么,它隐含在这里发生了类型转换?
答案 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
的所有要求。因此指针是迭代器,更具体地说它们是随机访问迭代器。所有随机访问迭代器也是双向迭代器。
因此,不涉及转换,指针按原样使用。