【问题标题】:Is a Pointer typecast to iterator?是指向迭代器的指针类型转换吗?
【发布时间】:2018-05-30 10:03:21
【问题描述】:

我遇到了以下代码:

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 是一个模板参数吗?

标签: c++ vector stl iterator


【解决方案1】:

那么,这里发生了隐式类型转换吗?

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

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


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

【讨论】:

  • 好的,reverse 是一个函数模板,所以它可以接受不同类型的参数,所以它基本上是在内部发生函数重载:),对吗?
  • @pankajkushwaha 没错,是的。
【解决方案2】:

其实算法是这样声明的

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

所以它是一个模板函数。可以这样写

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

模板参数的名称BidirectionalIterator 用于表示用户提供的模板参数必须具有运算符++ 和运算符--。而指针就满足了这个要求。

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

1 迭代器是指针的泛化,它允许 C++ 程序在不同的数据结构(容器)中工作 统一的方式...

【讨论】:

  • 但是为什么我们不调用函数作为模板函数应该被调用:reverse(arg1, arg2)??
  • @pankajkushwaha 函数从函数参数中推导出模板参数。
【解决方案3】:

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

如果满足标准中指定的Iterator 概念的要求,则该类型是迭代器。同样,如果满足BidirectionalIterator的要求,迭代器就是双向迭代器。

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

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

【讨论】:

  • 为什么我们不调用函数作为模板函数应该被调用:reverse(arg1 , arg2)?
  • @pankajkushwaha 我不太明白你的问题。 data+2 的类型是int*
  • 是的,我的意思是说为什么我们不调用这样的函数 reverse(data+2,data+6) ,我的意思是在示例中的函数调用中缺少模板类型。
  • @pankajkushwaha 我明白了。好吧,如果你愿意,你可以这样称呼它。它会起作用的。但是在调用模板函数时不需要指定模板参数,因为编译器会从传递的函数参数的类型中推断出模板参数。
猜你喜欢
  • 2016-09-17
  • 2011-12-29
  • 1970-01-01
  • 2018-09-04
  • 2010-10-19
  • 2023-04-04
  • 2017-04-04
  • 1970-01-01
  • 2013-11-23
相关资源
最近更新 更多