如何在C++;? 我的问题对于熟悉C++语法的人来说是一个简单的问题。我正在学习C++,这是一种作业。 template<typename Iter> void quickSort(Iter begin, Iter end) { //.. auto pivot = * ( begin + (end - begin)/2 ); //.. } 模板 无效快速排序(Iter开始,Iter结束) { //.. 自动枢轴=*(开始+(结束-开始)/2); //.. }

如何在C++;? 我的问题对于熟悉C++语法的人来说是一个简单的问题。我正在学习C++,这是一种作业。 template<typename Iter> void quickSort(Iter begin, Iter end) { //.. auto pivot = * ( begin + (end - begin)/2 ); //.. } 模板 无效快速排序(Iter开始,Iter结束) { //.. 自动枢轴=*(开始+(结束-开始)/2); //.. },c++,iterator,C++,Iterator,pivot应该包含间隔中心的值[开始,结束] 我在那里写的代码可以工作,但是auto是新的C++11语言标准中的一个关键字。怎么用老办法?我应该写什么而不是auto?typename std::iterator\u traits::value\u type 如果您的模板是用Iter作为指针类型实例化的,那么这将起作用 顺便说一下,typename不是类型本身的一部分。它告诉编译器value\u type实际上是一个类型。如果是函数或静态数据成员的名称,则会影响语法。编译器不一定知道它是什么,因为

pivot
应该包含间隔中心的值
[开始,结束]


我在那里写的代码可以工作,但是
auto
是新的C++11语言标准中的一个关键字。怎么用老办法?我应该写什么而不是
auto

typename std::iterator\u traits::value\u type

如果您的模板是用
Iter
作为指针类型实例化的,那么这将起作用


顺便说一下,
typename
不是类型本身的一部分。它告诉编译器
value\u type
实际上是一个类型。如果是函数或静态数据成员的名称,则会影响语法。编译器不一定知道它是什么,因为编译模板时,
Iter
迭代器特性的专门化可能不可见;在C++98中,必须使用std::iterator_traits,或者如果知道迭代器具有此typedef(例如,从std::iterator派生),则可以使用Iter::value_type。
然而,代码中还有另一个问题:通常不能简单地划分迭代器。当然,这适用于指针,但不适用于更一般的情况。更普遍的做法是:

Iter itPivot = std::advance(begin, std::distance(begin, end)/2);

这也将启动C++ 11:

typename Iter::value_type

因此,您不必键入整个
std::iterator\u traits
内容。

这就是我希望看到的。正在学习C++的人,使用迭代器和<代码> Audio<这是最好的解决方案,但值得指出的是,它不是一个通用的解决方案。它不能保证能够处理用户作为迭代器传递的所有内容。。。他们可能仍然需要向迭代器对象添加value_类型(或者为traits创建专门化)。另一种方法是继续使用迭代器,并创建一个到轴的迭代器,根据需要取消对它的引用,而不需要模板函数中的值类型。@Tony:没错,
auto
因此更好。但是,所有标准算法都要求用户传递具有<代码>迭代器特性
(24.3.1)的内容,并且用户定义的函数模板具有相同的限制是合理的。编写迭代器的人可以使用
std::iterator
作为基类,在尝试传入迭代器和实际传入
迭代器之间架起桥梁@Tony,@Steve-这里有一个noob问题,可以使用typeid()操作符吗?类似于type_info&ti=typeid(Iter)@Les:您可以使用typeid,应用于*Iter(而不是Iter)的typeid可以告诉您值类型的文本名称,但您不能基于typeid创建该类型的对象。。。typeid信息中没有指向工厂方法/构造函数的链接。@Les:Tony说的。GCC有一个
typeof
扩展名,而C++0x有
decltype
,它实际上为您提供了类型,而不仅仅是类型的类型信息。但是在这种特殊情况下,它们都没有改进
auto
。原始代码不划分迭代器,即使使用指针,这也不起作用。代码改为使用减法,它适用于所有随机访问迭代器(而不仅仅是指针)。而且,由于快速排序将针对其他迭代器类型进行排序(无论如何,这是一个有效的实现),因此在这里使用
操作符-
是可以的。