对于熟悉C ++语法的人来说,我的问题肯定是一个简单的问题。我只是在学习c ++,这是一些类型的作业。
template<typename Iter>
void quickSort(Iter begin, Iter end)
{
//..
auto pivot = * ( begin + (end - begin)/2 );
//..
}
pivot应该包含来自[begin,end]间隔中心的值。 ITE
我在那里写的代码很有用,但auto
是来自新语言标准的关键字。怎么做老路?写什么而不是auto
?
答案 0 :(得分:31)
typename std::iterator_traits<Iter>::value_type
如果您的模板使用Iter
作为指针类型进行实例化,这将有效。
顺便说一句,typename
不是类型本身的一部分。它告诉编译器value_type
确实是一种类型。如果它是函数或静态数据成员的名称,则会影响语法。编译器不一定知道它是什么,因为在编译模板时,iterator_traits
的{{1}}的特化可能不可见。
答案 1 :(得分:0)
史蒂夫的答案是正确的;在C ++ 98中,您必须使用std :: iterator_traits,或者如果您知道迭代器具有此typedef(例如,从std :: iterator派生),则可以使用Iter :: value_type。 但是,代码中还有另一个问题:通常不能简单地划分迭代器。当然,这适用于指针,但不是更一般的情况。更通用的方法是:
Iter itPivot = std::advance(begin, std::distance(begin, end)/2);
答案 2 :(得分:0)
从c ++ 11开始这也将起作用:
typename Iter::value_type
因此您不必键入整个std::iterator_traits
。