请问C++中泛型函数中value_type的有关问题

请教C++中泛型函数中value_type的问题
本帖最后由 yinqiaohua 于 2014-12-24 10:30:55 编辑
我写了一个快速排序的程序,用泛型函数写的,但是其中有个参数是要知道迭代器所指对象的数据类型。在主函数中,调用这样的函数的时候,数据类型的那一个参数该如何设置?
#include<iostream>
#include <vector>
#include <iterator>
using namespace std;
const int Threshold=1;
template <class RandomAccessIterator,class T>
RandomAccessIterator median_partion(RandomAccessIterator first,RandomAccessIterator last,T pivot)
{
while(1)
{
while(*first<pivot)
++first;
--last;
while(pivot<*last)
--last;
if(!(first<last))
return first;
iter_swap(first,last);
++first;

}
}
template <class T>
T& median(T& a1,T& a2,T& a3)
{
if(a1<a2)
{
if(a2<a3)
return a2;
else if(a1<a3)
return a3;
else 
return a1;
}
else
{
if(a1<a3)
return a1;
else if(a2<a3)
return a3;
else 
return a2;
}
}
template <class RandomAccessIterator,class T>
void quick_so1(RandomAccessIterator first,RandomAccessIterator last,T*)
{
while(last-first>Threshold)
{
RandomAccessIterator cut=median_partion(first,last,T(median(*first,*(first+(last-first)/2),*(last-1))));
if(cut-first>=last-cut)
{
quick_so1(cut,last,value_type(cut));
last=cut;
}
else
{
quick_so1(first,cut,value_type(first));
first=cut;
}

}
}

template <class RandomAccessIterator>
void quick_so2(RandomAccessIterator first,RandomAccessIterator last)
{
while(last-first>Threshold)
{
RandomAccessIterator cut=median_partion(first,last,int(median(*first,*(first+(last-first)/2),*(last-1))));
if(cut-first>=last-cut)
{
quick_so2(cut,last);
last=cut;
}
else
{
quick_so2(first,cut);
first=cut;
}

}
}

int main()
{
int a[]={72,56,101,47,16,34,19,27,18,92,45,61,39};
vector<int> ive(a,a+13);
quick_so1(a,a+13,value_type(a[0]));//这句有问题,第三个参数该如何设置?
quick_so2(ive.begin(),ive.end () );
for(int i=0;i<13;i++)
cout<<a[i]<<" ";
cout<<endl;
for(int i=0;i<13;i++)
cout<<ive[i]<<" ";
cout<<endl;
return 0;
}

------解决思路----------------------
iterator_traits提取iterator所指类型,是因为iterator里面有 typedef
------解决思路----------------------
引用:
Quote: 引用:

quick_so1 的 T 和第三个参数是多余的,删掉以后问题自然就消失了。


回复楼上,在我这个程序中,是因为我已经确定指针所指的是int类型,所以可以用quick_so2那种,但这种方式的抽象度和通用性都不行。我看在STL源码剖析里面,有个iterator_traits,可以用来提取出iterator所指的数据类型,可是不会用

我在说 quick_so1,不知道你为啥要说 quick_so2。
你就不能按我说的试试?然后看看能不能用,然后再看看 quick_so1 缺少 T 了以后到底丧失了那些通用性,然后再回来跟我说通用性或抽象度的问题。
主楼 quick_so1 的 T 唯一的用处就是把 median 的返回值喂给 median_partition,后者自带模板类型参数 T 能够现场推导,T(median(...)) 这个构造里的 T 本身就是多余的。
------解决思路----------------------
我是想告诉楼主他的参数其实是写错了。 a 和 &a[0] 对于模板是不一致的。

他的函数其实和 std::accumulate 是一致的。

	//template<class _InIt, class _Ty> inline _Ty accumulate(_InIt _First, _InIt _Last, _Ty _Val);
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sum1 = std::accumulate(&a[0], &a[10], 0);
int sum2 = std::accumulate(&a[1], &a[10], a[0]);