首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

小弟我想用函数模板实现输入n个整型 、 双精度型 、字符串型数据能够按从小到大的顺序输出

2013-06-25 
我想用函数模板实现输入n个整型 、 双精度型 、字符串型数据能够按从小到大的顺序输出#includeiostream#in

我想用函数模板实现输入n个整型 、 双精度型 、字符串型数据能够按从小到大的顺序输出
#include<iostream>
#include<string>
#include<vector>
using namespace std;

template <typename T,vector V>
T  sort(typename T,vector V)
{
vector<typename T>::iterator iter;
for(int i=V.size()-1;i>0;i--)
{
   for(int j=0;j<i;j++)
   {
   if(V[j]>V[j+1])
   {
   int t;
   t=V[j];
   V[j]=V[j+1];
   V[j+1]=t;
   }
   }
}
    for(iter=V.begin();iter!=V.end();iter++)
{
  cout<<(*iter)<<"  ";
}
}

int main()
{
cout<<"******用模板函数排序******"<<endl<<endl;
cout<<"请选择比较数据的类型:"<<endl<<"1:整型(int)"<<endl<<"2:双精度型(double)"<<endl<<"3:字符串型(string)"<<endl;
cout<<"请输入你的选择:";
int n;
cin>>n;
if(n==1)
  {  cout<<"请输入你要比较的数据:"<<endl;  
  vector<int>vec1;
      for(int i=0;;i++)
    cin>>vec1[i];
  sort(int ,vec1);
 
     else if(n==2)
{ cout<<"请输入你要比较的数据:"<<endl;  
  vector<double>vec2;
      for(int i=0;;i++)
      cin>>vec2[i];
  sort(double ,vec2);
   
 else if(n==3)
 {cout<<"请输入你要比较的数据:"<<endl;  
  vector<string>vec3;
      for(int i=0;;i++)
     cin>>vec3[i];
  sort(string ,vec3);
  }
     }
   }

system("pause");
return 0;
}

哎,错误百出,求大神指教。。。
[解决办法]
下面是由你的代码修改的sort函数:


template <typename T,typename Vector>//模板参数或者是typename/struct/class,或者是template,或者是整数类型,不能是vector
void sort( Vector & V)//函数参数不能是类型,sort(typename T...是不正确的。vector应该传引用。该函数并没有返回值。
{
  typename Vector::iterator iter;
  for(int i=V.size()-1;i>0;i--)
  {
    for(int j=0;j<i;j++)
    {
      if(V[j]>V[j+1])
      {
        T t;//临时变量应该是T类型,而不是int
        t=V[j];
        V[j]=V[j+1];
        V[j+1]=t;
      }
    }
  }
  for(iter=V.begin();iter!=V.end();iter++)
  {
    cout<<(*iter)<<"  ";


  }
}




以上是依据你的代码修改的结果,调用时要显式指明T的类型:

  sort<int>(vec1);


main中的代码连括号位置都不正确,自己改一下吧。输出代码也应该在main中,或是单独写一个输出函数,而不是在sort中。

不过,要实现泛型的sort,最好还是象std::sort那样,接收两个迭代器作为参数。如果一定要以vector为参数的话,最好写成这样:

  template < typename T, typename A, template< typename _T, typename _A> class _V >
  void sort( _V< T, A > V)
  {
     typedef _V<T, A> vector_type;
     typename vector_type::iterator iter
     ...


这样写在调用时就不需要sort<int>(vec1),只要sort(vec1)就行了。

如果对template类型的模板参数不习惯,也可以这样

  template < typename _V >
  void sort( _V V)
  {
     typedef typename _V::value_type T;
     typename _V::iterator iter
     ...


[解决办法]

#include<iostream>
#include<string>
#include<vector>
using namespace std;

template <class V>
void mySort(V &con)
{
//vector<typename T>::iterator iter;
typename V::iterator iter;
typename V::size_type i;
typename V::size_type j;
for(i = con.size()-1; i>0; i--)
{
for(j=0; j<i; j++)
{
if(con[j]>con[j+1])
{
typename V::value_type t;
//这里要保证vector元素类型的对象是可以判断大小以及支持赋值运算符操作的
//这里你设置的都是一些基本类型,所以不用考虑这个问题
//但是一旦你vector中存储的是自定义类型的数据,我说的这些就是必须要考虑的了
t = con[j];
con[j] = con[j+1];
con[j+1] = t;
}
}
}
for(iter = con.begin(); iter!=con.end(); iter++)
{
 //这里也是一样的,自定义类型要重载这个标准输出流,基本类型可以不用考虑
cout<<(*iter)<<"  ";
}
}

int TestMain()
{

cout<<"******用模板函数排序******"<<endl<<endl;
cout<<"请选择比较数据的类型:"<<endl<<"1:整型(int)"<<endl<<"2:双精度型(double)"<<endl<<"3:字符串型(string)"<<endl;
cout<<"请输入你的选择:";
int n;
cin>>n;
if(n==1)
{
cout<<"请输入你要比较的数据:"<<endl;
vector<int> vec1;
int val;
for(int i=0;;i++)
{
//你这个循环是死循环,要有一个控制输入的条件,自己选择吧
cin>>val;
//vector的最大好处是自动增长,但是你先前是没有给他分配空间的,所以直接[]操作是内存错误
vec1.push_back(val);
}
mySort(vec1);
}

else if(n==2)
{
cout<<"请输入你要比较的数据:"<<endl;  
vector<double> vec2;
double val;
for(int i=0;;i++)
{
cin>>val;
vec2.push_back(val);
}
mySort(vec2);
}
else if(n==3)
{
cout<<"请输入你要比较的数据:"<<endl; 
vector<string> vec3;
string str;
for(int i=0;;i++)
{
cin>>str;
vec3.push_back(str);
}
mySort(vec3);
}

system("pause");
return 0;
}

热点排行