免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1730 | 回复: 5
打印 上一主题 下一主题

[C++] 一段STL模版的代码(C++),属于书写错误。现结贴!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-02 14:43 |只看该作者 |倒序浏览
1 #include <iostream>;
      2 #include <string>;
      3 #include <vector>;
      4 #include <algorithm>;
      5 using namespace std;
      6
      7 template <typename Type>;
      8 inline Type max(Type t1,Type t2){return t1 >; t2 ? t1:t2 ;}
      9
     10 template <typename elemType>;
     11 inline elemType max(const vector<elemType>; &vec)
     12         {return *max_element( vec.begin(),vec.den() );}
     13
     14 template <typename arrayType>;
     15 inline arrayType max(const arrayType* parray,int size)
     16         { return *max_element(parray,parray+size);}
     17
     18 int main()
     19 {
     20         string sarray[]={"we","were","her","pride","of","course"};
     21         vector<string>; svec(sarray,sarray+7);
     22
     23         int iarray[]={2,3,55,6,7,88,45};
     24         vector<int>; ivec(iarray,iarray+7);
     25
     26         float farray[]={2.5,3.5,33.2,5.6,45,7.9};
     27         vector<float>; fvec(farray,farray+6);
     28
     29         int imax = max(max(ivec),max(iarray,7));
     30         float fmax = max(max(fvec),max(farray,7));
     31         string smax = max(max(svec),max(svec,6));
     32
     33         cout << "imax should be -- found: " << imax << endl;
     34         cout << "fmax should be -- found: " << fmax << endl;
     35         cout << "smax should be -- found: " << smax << endl;
     36         return 0;
     37 }
     # g++ test.cpp -o test
出错举例:
temp.cpp:31: no matching function for call to `max (vector<string,
allocator<string>; >; &, int)'
and so on!!!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-06-02 15:35 |只看该作者

一段STL模版的代码(C++),属于书写错误。现结贴!!

max(svec,6)你准备调用什么函数?

论坛徽章:
0
3 [报告]
发表于 2004-06-02 16:00 |只看该作者

一段STL模版的代码(C++),属于书写错误。现结贴!!

12 {return *max_element( vec.begin(),vec.den() );}
应该为 {return *max_element( vec.begin(),vec.end() );}
31 string smax = max(max(svec),max(svec,6));
应该为string smax = max(max(svec),max(sarray,6));

论坛徽章:
0
4 [报告]
发表于 2004-06-02 16:54 |只看该作者

一段STL模版的代码(C++),属于书写错误。现结贴!!

C++标准库中已经提供了 max()函数的实现,不需要你自己再定义。因此,你应该把第7、8行的代码去掉。

至于10-12行的代码只是对 max_element() 函数的一个简单的包装。这种情况下,你不应该使用和标准库中的函数同名的函数,用另外的函数名对这个函数进行命名。另外,我认为与其使用你这个函数,还不如直接使用max_element()函数直观和简单些。

对于14-16行的代码同上:不要使用max命名自定义函数,用另外一个函数名;或者把这些代码从程序中去除,直接使用max_element()函数。

你代码中的算法很奇怪。比如,ivec和iarray存储的是相同的整数序列,因此max(ivec)和max(iarray,7)即ivec中的最大值和iarray中的最大值是相同的。既然如此,还有必要再比较这两个最大值哪个更大吗?不过,如果你只是为了测试你写的max()函数的话我倒无话可说。

程序中还存在着一处错误:sarray中明明只有6个数组元素,你在下面却这样用sarray初始化svec:vector<string>; svec(sarray,sarray+7);。这一句中的“7”应该改为6才对吧。要细心一点。

按照我的理解,你的程序可以作如下改写(不使用自定义的max()之类的函数。在你这个题目中完全没有必要自定义max,使用C++标准库提供的函数即可)。你可以跟你的程序比较一下,看哪一个更简洁好用些。

  1. #include <iostream>;
  2. #include <string>;
  3. #include <vector>;
  4. #include <algorithm>;
  5. using namespace std;

  6. int main()
  7. {
  8.   string sarray[]={"we", "were", "her", "pride", "of", "course"};
  9.   //  vector<string>; svec(sarray,sarray+7);
  10.   vector<string>; svec(sarray,sarray+6);

  11.   int iarray[]={2, 3, 55, 6, 7, 88, 45};
  12.   vector<int>; ivec(iarray,iarray+7);

  13.   float farray[]={2.5, 3.5, 33.2, 5.6, 45, 7.9};
  14.   vector<float>; fvec(farray,farray+6);

  15.   //  int imax = max(max(ivec),max(iarray,7));
  16.   // 按照上一句的算法,可实现如下:
  17.   int imax = max( *max_element(ivec.begin(), ivec.end()),
  18.                   *max_element(iarray, iarray+7) );
  19.   // 其实,上面的算法是不必要的,简单地如下实现即可:
  20.   // int imax = *max_element(ivec.begin(), ivec.end());

  21.   // 下面的求最大值的方法采取上面的后一种方法来实现

  22.   //  float fmax = max(max(fvec),max(farray,7));
  23.   float fmax = *max_element(fvec.begin(), fvec.end());

  24.   //  string smax = max(max(svec),max(svec,6));
  25.   string smax = *max_element(svec.begin(), svec.end());

  26.   cout << "imax should be -- found: " << imax << endl;
  27.   cout << "fmax should be -- found: " << fmax << endl;
  28.   cout << "smax should be -- found: " << smax << endl;
  29. }
复制代码

论坛徽章:
0
5 [报告]
发表于 2004-06-02 17:50 |只看该作者

一段STL模版的代码(C++),属于书写错误。现结贴!!

呵呵,sorry,误导大家了。纯粹书写错误。。
whyglinux      
风云使者
你说的很多,是不用那么复杂,我只是为了测试使用一下模版而已。

论坛徽章:
0
6 [报告]
发表于 2004-06-02 18:26 |只看该作者

一段STL模版的代码(C++),属于书写错误。现结贴!!

原帖由 "toxyboy" 发表:
呵呵,sorry,误导大家了。纯粹书写错误。。
whyglinux      
风云使者
你说的很多,是不用那么复杂,我只是为了测试使用一下模版而已。

真的是纯粹书写错误吗?那样的话我也就没有必要说那么多了。主要的错误还在于你自己定义的max()函数和标准库中的同名函数发生冲突的问题吧。你说纯粹是书写错误,不知道你是怎样在改正了几个书写错误后通过编译的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP