鱼C论坛

 找回密码
 立即注册
查看: 1748|回复: 10

[已解决]函数模板翻车了,求修车老师傅

[复制链接]
发表于 2019-11-6 02:37:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 bin554385863 于 2019-11-6 02:44 编辑
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstring>
  4. template <typename ty, size_t count>
  5. //内置数组版本
  6. ty max(ty (&arr)[count]) //求数组最大值
  7. {
  8.     ty tmp = arr[0];
  9.     for (size_t i = 0; i < count; i++)
  10.     {
  11.         tmp = tmp > arr[i] ? tmp : arr[i];
  12.     }
  13.     return tmp;
  14. }
  15. //可变数组版本
  16. template <typename ty>//求数组最大值
  17. ty max(std::vector<ty> &vec)
  18. {
  19.     ty tmp = vec[0];
  20.     for (ty arg : vec)
  21.     {
  22.         tmp = tmp > arg ? tmp : arg;
  23.     }
  24.     return tmp;
  25. }
  26. //字符串版本
  27. template <typename ty, size_t count>
  28. char *max(char *(&ptr)[count]) //---->此处翻车
  29. /*模板函数具体化.返回最长字符串的地址*/
  30. {
  31.     char *p = ptr[0];
  32.     for (char* i = *ptr; *i != '\0'; i++)
  33.     {
  34.         p = strlen(p) > strlen(i) ? p : i;
  35.     }
  36.     return p;
  37. }
  38. int main(int argc, char const *argv[])
  39. {
  40.     int arr[] = {1, 2, 3, 6, 54, 79, 99};
  41.     std::cout << "内置类型数组版本 :" << max(arr) << std::endl;
  42.     std::vector<float> vec = {3.14, 2.718, 3.163, 1.414, 2.236};
  43.     std::cout << "vector版本 :" << max(vec) << std::endl;
  44.     char *str[4] = {"hello", "fish999999999", "ccc11111"," 0000"};//-->此处翻车
  45.     std::cout << "C字符串版本 :" << max<char>(str) << std::endl;
  46.     return 0;
  47. }
复制代码

----------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.418]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-wp4hmq2a.xme --stdout=Microsoft-MIEngine-Out-wxm41rzx.ghd --stderr=Microsoft-MIEngine-Error-lxfsv31m.z1a --pid=Microsoft-MIEngine-Pid-011vwlao.e3h --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
内置类型数组版本 :99
vector版本 :3.163
C字符串版本 :hello--->此处翻车

E:\Users\admin\Documents\VScode>
最佳答案
2019-11-6 12:42:05
找不同,然后回答问题^_^
这两个算法一样吗?有什么区别?

  1. //字符串版本
  2. template <typename ty, size_t count>
  3. char *max(char *(&ptr)[count]) //---->此处翻车
  4. /*模板函数具体化.返回最长字符串的地址*/
  5. {
  6.     char *p = ptr[0];
  7.     for (char* i = *ptr; *i != '\0'; i++)
  8.     {
  9.         p = strlen(p) > strlen(i) ? p : i;
  10.     }
  11.     return p;
  12. }
复制代码

  1. //字符串版本
  2. template <typename ty, size_t count>
  3. char *max(char *const (&ptr)[count]) //把类型设置为常引用就好了,具体原因不知道,求解?
  4. {
  5.     char *p = ptr[0];
  6.     for (size_t i = 0; i < count; i++)
  7.     {
  8.         p = strlen(p) > strlen(ptr[i]) ? p : ptr[i];
  9.     }
  10.     return p;
  11. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-6 02:47:16 | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-6 03:31 编辑
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstring>
  4. template <typename ty, size_t count>
  5. //内置数组版本
  6. ty max(const ty (&arr)[count]) //数组的引用
  7. {
  8.     ty tmp = arr[0];
  9.     for (size_t i = 0; i < count; i++)
  10.     {
  11.         tmp = tmp > arr[i] ? tmp : arr[i];
  12.     }
  13.     return tmp;
  14. }
  15. //可变数组版本
  16. template <typename ty>
  17. ty max(const std::vector<ty> &vec)
  18. {
  19.     ty tmp = vec[0];
  20.     for (ty arg : vec)
  21.     {
  22.         tmp = tmp > arg ? tmp : arg;
  23.     }
  24.     return tmp;
  25. }
  26. //字符串版本
  27. template <typename ty, size_t count>
  28. char *max(char *const (&ptr)[count]) //把类型设置为常引用就好了,具体原因不知道,求解?
  29. {
  30.     char *p = ptr[0];
  31.     for (size_t i = 0; i < count; i++)
  32.     {
  33.         p = strlen(p) > strlen(ptr[i]) ? p : ptr[i];
  34.     }
  35.     return p;
  36. }
  37. int main(int argc, char const *argv[])
  38. {
  39.     int arr[] = {1, 2, 3, 6, 54, 79, 99};
  40.     std::cout << "内置类型数组版本 :" << max(arr) << std::endl;
  41.     std::vector<float> vec = {3.14, 2.718, 3.163, 1.414, 2.236};
  42.     std::cout << "vector版本 :" << max(vec) << std::endl;
  43.     char *str[4] = {"hello", "fish999999999", "ccc11111"," 000000000000000000000"};
  44.     std::cout << "C字符串版本 :" << max<char>(str) << std::endl;
  45.     return 0;
  46. }
复制代码

---------------------------------------------------------------------------------------------------------------------------
Microsoft Windows [版本 10.0.18363.418]
(c) 2019 Microsoft Corporation。保留所有权利。

E:\Users\admin\Documents\VScode>c:\Users\admin\.vscode\extensions\ms-vscode.cpptools-0.26.1\debugAdapters\bin\WindowsDebugLauncher.exe --stdin=Microsoft-MIEngine-In-sa0t0owb.i5f --stdout=Microsoft-MIEngine-Out-t0fvw4sd.ynd --stderr=Microsoft-MIEngine-Error-0dl1xzbo.3ne --pid=Microsoft-MIEngine-Pid-nehnila4.4e0 --dbgExe=D:\MinGW\bin\gdb.exe --interpreter=mi
内置类型数组版本 :99
vector版本 :3.163
C字符串版本 : 000000000000000000000


E:\Users\admin\Documents\VScode>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 12:30:18 | 显示全部楼层
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstring>
  4. template <typename ty, size_t count>
  5. //内置数组版本
  6. ty max(ty(&arr)[count]) //求数组最大值
  7. {
  8.         ty tmp = arr[0];
  9.         for(size_t i = 0; i < count; i++)
  10.         {
  11.                 tmp = tmp > arr[i] ? tmp : arr[i];
  12.         }
  13.         return tmp;
  14. }
  15. //可变数组版本
  16. template <typename ty>//求数组最大值
  17. ty max(std::vector<ty> &vec)
  18. {
  19.         ty tmp = vec[0];
  20.         for(ty arg : vec)
  21.         {
  22.                 tmp = tmp > arg ? tmp : arg;
  23.         }
  24.         return tmp;
  25. }
  26. //字符串版本
  27. template <typename ty, size_t count>
  28. const char *max(const char *(&ptr)[count]) //---->此处翻车
  29. /*模板函数具体化.返回最长字符串的地址*/
  30. {
  31.         const char *max = ptr[0];
  32.         for(size_t i = 1; ptr[i]; ++i)
  33.         {
  34.                 if(strlen(max) < strlen(ptr[i]))
  35.                         max = ptr[i];
  36.         }
  37.         return max;

  38.         /*const char *p = ptr[0];
  39.         for(const char* i = *ptr; *i != '\0'; i++)
  40.         {
  41.                 p = strlen(p) > strlen(i) ? p : i;
  42.         }
  43.         return p;*/
  44. }
  45. int main(int argc, char const *argv[])
  46. {
  47.         int arr[] = {1, 2, 3, 6, 54, 79, 99};
  48.         std::cout << "内置类型数组版本 :" << max(arr) << std::endl;
  49.         std::vector<float> vec = {3.14, 2.718, 3.163, 1.414, 2.236};
  50.         std::cout << "vector版本 :" << max(vec) << std::endl;
  51.        
  52.         //const char *str[4] = {"hello", "fish999999999", "ccc11111", " 0000"};//-->此处翻车
  53.         const char *str[] = {"hello", "fish999999999", "ccc11111", " 0000", NULL};
  54.         std::cout << "C字符串版本 :" << max<char>(str) << std::endl;
  55.         return 0;
  56. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 12:32:49 | 显示全部楼层
你的算法不对吧,而且你忽略了一些东西,C/C++中的数组需要你传递长度信息,数组名传给函数后就变成了一个指针,就不包含长度信息了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 12:34:43 | 显示全部楼层
  1. #include <iostream>

  2. void test(int arr[10])
  3. {
  4.         std::cout << sizeof(arr) << std::endl;
  5. }

  6. int main(int argc, char const *argv[])
  7. {
  8.         int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
  9.         std::cout << sizeof(arr) << std::endl;
  10.         test(arr);
  11.         return 0;
  12. }

  13. // 40
  14. // 8
  15. // 请按任意键继续. . .
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 12:42:05 | 显示全部楼层    本楼为最佳答案   
找不同,然后回答问题^_^
这两个算法一样吗?有什么区别?

  1. //字符串版本
  2. template <typename ty, size_t count>
  3. char *max(char *(&ptr)[count]) //---->此处翻车
  4. /*模板函数具体化.返回最长字符串的地址*/
  5. {
  6.     char *p = ptr[0];
  7.     for (char* i = *ptr; *i != '\0'; i++)
  8.     {
  9.         p = strlen(p) > strlen(i) ? p : i;
  10.     }
  11.     return p;
  12. }
复制代码

  1. //字符串版本
  2. template <typename ty, size_t count>
  3. char *max(char *const (&ptr)[count]) //把类型设置为常引用就好了,具体原因不知道,求解?
  4. {
  5.     char *p = ptr[0];
  6.     for (size_t i = 0; i < count; i++)
  7.     {
  8.         p = strlen(p) > strlen(ptr[i]) ? p : ptr[i];
  9.     }
  10.     return p;
  11. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 13:40:53 | 显示全部楼层
本帖最后由 superbe 于 2019-11-6 13:50 编辑

大神已经回答过了。但我测试了,还是发上来吧。
  1. template <typename ty, size_t count>
  2. char *max(char *(&ptr)[count]) //---->此处翻车
  3. //*模板函数具体化.返回最长字符串的地址*
  4. {
  5.     char *p = ptr[0];
  6.     //for (char* i = *ptr; *i != '\0'; i++)
  7.     for (char **i = &ptr[0]; **i != '\0'; i++)
  8.     {
  9.         p = strlen(p) > strlen(*i) ? p : *i;
  10.     }
  11.     return p;
  12. }
复制代码

  1. int main()
  2. {
  3.     char *str[4] = {"hello", "fish9999999999", "ccc11111","\0"};//-->此处翻车
  4.     std::cout << "C字符串版本:" << max<char>(str) << std::endl;

  5.     return 0;
  6. }
复制代码


原来的max函数里char *i, i是一个字符指针,i++指向下一个字符而不是下一个字符串。
main里最后一个" 0000"改成了"\0",以和循环条件 **i != '\0'; 相对应。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-6 14:58:32 From FishC Mobile | 显示全部楼层
人造人 发表于 2019-11-6 12:34

3Q
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-6 15:01:43 From FishC Mobile | 显示全部楼层
superbe 发表于 2019-11-6 13:40
大神已经回答过了。但我测试了,还是发上来吧。



谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-6 15:14:44 From FishC Mobile | 显示全部楼层
本帖最后由 bin554385863 于 2019-11-6 17:36 编辑
人造人 发表于 2019-11-6 12:34


不是我忽略数组大小,我是故意的,网上说像
template<typename ty , size_t N>
size_t func(ty (&arr)[N])
{
        return N
}
可以在不知数组大小,只知道元素的情况下返回数组的大小,我试了下的确可以,也就是数组名传入函数后N的值就确定了。所以就那样写了。具体原理就不知道了,^_^我现在还是在用的阶段,至于底层原理还早呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-6 21:32:35 | 显示全部楼层
bin554385863 发表于 2019-11-6 15:14
不是我忽略数组大小,我是故意的,网上说像
template
size_t func(ty (&arr)[N])

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 11:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表