c++ - 这个模板有什么问题
问题描述
我正在做 c++ 6th edition 第 8 章的第 6 练习。我对此模板有疑问。我不知道为什么它总是显示最后一个字符串而不显示具有最大长度的字符串。
#include <iostream>
#include <cstring>
//8.6
using namespace std;
template <typename T> T Maxn(T *,int);
template <> char * Maxn<>(char **,int );
int main()
{
double arr_1[5] = { 0.0,3.0,1.0,4.0,5.0 };
cout << "double max: " << Maxn(arr_1,5) << endl;
int arr_2[4] = { 3,4,1,0 };
cout << "int max: " << Maxn(arr_2, 4) << endl;
const char *arr_3[4] = { "sdf","tttq","ttttrrsdss" ,"q12221"};
cout << "char max:" << Maxn(arr_3, 4) << endl;
return 0;
}
template <typename T>
T Maxn(T *p,int n)
{
T max = p[0];
for (int i = 0; i < n; i++)
{
if (p[i] > max)
max = p[i];
}
return max;
}
template <> char * Maxn<>(char **p, int n)
{
char * max = p[0];
for (int i = 0; i < n; i++)
{
if (strlen(p[i]) > strlen(max))
{
max = p[i];
}
}
return max;
}
解决方案
您应该简单地开始使用调试器,或者至少可以使用 printf 调试来访问您的代码。您会看到,您的char*
专长从未被使用过!
原因:
您的“字符串”数据类型const char*
与第一个模板相比与您的专业化匹配更好,因此只需调用第一个模板版本。现在比较字符串的地址。如果您的编译器按源中显示的顺序放置字符串,您将始终看到最后一个字符串作为结果,因为它具有最高地址。
只需使用:
template <> const char * Maxn<>(const char **p, int n)
{
const char * max = p[0];
for (int i = 0; i < n; i++)
{
if (strlen(p[i]) > strlen(max))
{
max = p[i];
}
}
return max;
}
顺便说一句:您的代码有一些效率流程。您在第一步中将不需要的相同值比较两次。
推荐阅读
- python - 获取请求,发送相同的参数但结果不同
- python - 如何避免不同版本的 pip 在同一目录中安装二进制文件?
- maven - maven 使用 properties-maven-plugin 从文件中读取版本
- javascript - 获取用户音频时的 Google Chrome Javascript 问题 - 不允许启动 AudioContext
- java - 我需要在 Java 中短时间存储未知数量的关联数据
- php - 在 Woocommerce 3 中检查订单是否包含任何退款
- css - 是否可以为css网格内的一行设置背景
- node.js - 如何设置可写高水位线?
- apache-spark - Spark Cassandra 连接器 - 输入获取大小
- python - 使用python将数据框覆盖到已经存在的excel文件