函数模板翻车了,求修车老师傅
本帖最后由 bin554385863 于 2019-11-6 02:44 编辑#include <iostream>
#include <vector>
#include <cstring>
template <typename ty, size_t count>
//内置数组版本
ty max(ty (&arr)) //求数组最大值
{
ty tmp = arr;
for (size_t i = 0; i < count; i++)
{
tmp = tmp > arr ? tmp : arr;
}
return tmp;
}
//可变数组版本
template <typename ty>//求数组最大值
ty max(std::vector<ty> &vec)
{
ty tmp = vec;
for (ty arg : vec)
{
tmp = tmp > arg ? tmp : arg;
}
return tmp;
}
//字符串版本
template <typename ty, size_t count>
char *max(char *(&ptr)) //---->此处翻车
/*模板函数具体化.返回最长字符串的地址*/
{
char *p = ptr;
for (char* i = *ptr; *i != '\0'; i++)
{
p = strlen(p) > strlen(i) ? p : i;
}
return p;
}
int main(int argc, char const *argv[])
{
int arr[] = {1, 2, 3, 6, 54, 79, 99};
std::cout << "内置类型数组版本 :" << max(arr) << std::endl;
std::vector<float> vec = {3.14, 2.718, 3.163, 1.414, 2.236};
std::cout << "vector版本 :" << max(vec) << std::endl;
char *str = {"hello", "fish999999999", "ccc11111"," 0000"};//-->此处翻车
std::cout << "C字符串版本 :" << max<char>(str) << std::endl;
return 0;
}
----------------------------------------------------------------------
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> 本帖最后由 bin554385863 于 2019-11-6 03:31 编辑
#include <iostream>
#include <vector>
#include <cstring>
template <typename ty, size_t count>
//内置数组版本
ty max(const ty (&arr)) //数组的引用
{
ty tmp = arr;
for (size_t i = 0; i < count; i++)
{
tmp = tmp > arr ? tmp : arr;
}
return tmp;
}
//可变数组版本
template <typename ty>
ty max(const std::vector<ty> &vec)
{
ty tmp = vec;
for (ty arg : vec)
{
tmp = tmp > arg ? tmp : arg;
}
return tmp;
}
//字符串版本
template <typename ty, size_t count>
char *max(char *const (&ptr)) //把类型设置为常引用就好了,具体原因不知道,求解?
{
char *p = ptr;
for (size_t i = 0; i < count; i++)
{
p = strlen(p) > strlen(ptr) ? p : ptr;
}
return p;
}
int main(int argc, char const *argv[])
{
int arr[] = {1, 2, 3, 6, 54, 79, 99};
std::cout << "内置类型数组版本 :" << max(arr) << std::endl;
std::vector<float> vec = {3.14, 2.718, 3.163, 1.414, 2.236};
std::cout << "vector版本 :" << max(vec) << std::endl;
char *str = {"hello", "fish999999999", "ccc11111"," 000000000000000000000"};
std::cout << "C字符串版本 :" << max<char>(str) << std::endl;
return 0;
}
---------------------------------------------------------------------------------------------------------------------------
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> #include <iostream>
#include <vector>
#include <cstring>
template <typename ty, size_t count>
//内置数组版本
ty max(ty(&arr)) //求数组最大值
{
ty tmp = arr;
for(size_t i = 0; i < count; i++)
{
tmp = tmp > arr ? tmp : arr;
}
return tmp;
}
//可变数组版本
template <typename ty>//求数组最大值
ty max(std::vector<ty> &vec)
{
ty tmp = vec;
for(ty arg : vec)
{
tmp = tmp > arg ? tmp : arg;
}
return tmp;
}
//字符串版本
template <typename ty, size_t count>
const char *max(const char *(&ptr)) //---->此处翻车
/*模板函数具体化.返回最长字符串的地址*/
{
const char *max = ptr;
for(size_t i = 1; ptr; ++i)
{
if(strlen(max) < strlen(ptr))
max = ptr;
}
return max;
/*const char *p = ptr;
for(const char* i = *ptr; *i != '\0'; i++)
{
p = strlen(p) > strlen(i) ? p : i;
}
return p;*/
}
int main(int argc, char const *argv[])
{
int arr[] = {1, 2, 3, 6, 54, 79, 99};
std::cout << "内置类型数组版本 :" << max(arr) << std::endl;
std::vector<float> vec = {3.14, 2.718, 3.163, 1.414, 2.236};
std::cout << "vector版本 :" << max(vec) << std::endl;
//const char *str = {"hello", "fish999999999", "ccc11111", " 0000"};//-->此处翻车
const char *str[] = {"hello", "fish999999999", "ccc11111", " 0000", NULL};
std::cout << "C字符串版本 :" << max<char>(str) << std::endl;
return 0;
}
你的算法不对吧,而且你忽略了一些东西,C/C++中的数组需要你传递长度信息,数组名传给函数后就变成了一个指针,就不包含长度信息了
#include <iostream>
void test(int arr)
{
std::cout << sizeof(arr) << std::endl;
}
int main(int argc, char const *argv[])
{
int arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
std::cout << sizeof(arr) << std::endl;
test(arr);
return 0;
}
// 40
// 8
// 请按任意键继续. . .
找不同,然后回答问题^_^
这两个算法一样吗?有什么区别?
//字符串版本
template <typename ty, size_t count>
char *max(char *(&ptr)) //---->此处翻车
/*模板函数具体化.返回最长字符串的地址*/
{
char *p = ptr;
for (char* i = *ptr; *i != '\0'; i++)
{
p = strlen(p) > strlen(i) ? p : i;
}
return p;
}
//字符串版本
template <typename ty, size_t count>
char *max(char *const (&ptr)) //把类型设置为常引用就好了,具体原因不知道,求解?
{
char *p = ptr;
for (size_t i = 0; i < count; i++)
{
p = strlen(p) > strlen(ptr) ? p : ptr;
}
return p;
} 本帖最后由 superbe 于 2019-11-6 13:50 编辑
大神已经回答过了。但我测试了,还是发上来吧。
template <typename ty, size_t count>
char *max(char *(&ptr)) //---->此处翻车
//*模板函数具体化.返回最长字符串的地址*
{
char *p = ptr;
//for (char* i = *ptr; *i != '\0'; i++)
for (char **i = &ptr; **i != '\0'; i++)
{
p = strlen(p) > strlen(*i) ? p : *i;
}
return p;
}
int main()
{
char *str = {"hello", "fish9999999999", "ccc11111","\0"};//-->此处翻车
std::cout << "C字符串版本:" << max<char>(str) << std::endl;
return 0;
}
原来的max函数里char *i, i是一个字符指针,i++指向下一个字符而不是下一个字符串。
main里最后一个" 0000"改成了"\0",以和循环条件 **i != '\0'; 相对应。 人造人 发表于 2019-11-6 12:34
3Q{:10_256:} superbe 发表于 2019-11-6 13:40
大神已经回答过了。但我测试了,还是发上来吧。
谢谢{:10_256:} 本帖最后由 bin554385863 于 2019-11-6 17:36 编辑
人造人 发表于 2019-11-6 12:34
不是我忽略数组大小,我是故意的,网上说像
template<typename ty , size_t N>
size_t func(ty (&arr))
{
return N
}
可以在不知数组大小,只知道元素的情况下返回数组的大小,我试了下的确可以,也就是数组名传入函数后N的值就确定了。所以就那样写了。具体原理就不知道了,^_^我现在还是在用的阶段,至于底层原理还早呢 bin554385863 发表于 2019-11-6 15:14
不是我忽略数组大小,我是故意的,网上说像
template
size_t func(ty (&arr))
嗯
页:
[1]