如何在C ++中从迭代器中检索值类型?

时间:2010-10-19 11:51:55

标签: c++ iterator

对于熟悉C ++语法的人来说,我的问题肯定是一个简单的问题。我只是在学习c ++,这是一些类型的作业。

template<typename Iter>
void quickSort(Iter begin, Iter end)
{        
    //..
    auto pivot = * ( begin + (end - begin)/2 );
    //..
}

pivot应该包含来自[begin,end]间隔中心的值。 ITE 我在那里写的代码很有用,但auto是来自新语言标准的关键字。怎么做老路?写什么而不是auto

3 个答案:

答案 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