1.解释为什么程序1-7的交换函数没有把形参x和y所对应的实参的值交换。如何修改代码,使实参的值得到交换?
void swap(int x,int y)
{//交换整数x和y
int temp=x;
x=y;
y=temp;
}
调用swap函数是将实参的值复制一份给x和y,本质是交换了x和y而没有交换实参,swap函数使用结束后x和y的值也被释放,使用实参值没有被修改。
void swap(int &x,int &y) //使用引用传参传进来的值是实参的值
{//交换整数x和y
int temp=x;
x=y;
y=temp;
}
2.编写一个模板函数count,返回值是a[0:n-1]中value出现的次数。测试你的代码。
template<class T>
int count(T* a,int n,const T& value)
{
int sum = 0;
for(int i=0;i<n;++i)
if(a[i]==value)
++sum;
return sum;
}
3.编写一个模板函数fill,给数组a[start:end-1]赋值value。测试你的代码。
template<class T>
void fill(T* a,int start,int end,const T& value)
{
for(int i=start;i<end;++i)
a[i] = value;
}
4.编写一个模板函数inner_product,返回值是$\sum\limits_{i = 0}^{{\rm{n - 1}}} {a[i]*b[i]} $。测试你的代码。
template<class T>
int inner_product(T* a,T* b,int n)
{
T sum = 0;
for(int i=0;i<n;++i)
sum+=a[i]*b[i];
return sum;
}
5.编写一个模板函数iota,使a[i]=value+i,0≤i<n。测试你的代码。
template<class T>
void iota(T* a,int n,const T& value)
{
for(int i=0;i<n;++i)
a[i]+=value;
}
6.编写一个模板函数is_sorted,当且仅当a[0:n-1]有序时,返回值是true。测试你的代码。
template<class T>
bool is_sorted(const T* a, int size) {
//only one item, ordered
if (1 == size) {
return true;
}
bool asc_ordered = false, desc_order = false;
for (int i = 0; i < size - 1; ++i) {
if (a[i] == a[i + 1]) {
continue;
} else if (a[i] < a[i + 1]) {
asc_ordered = true;
} else {
desc_order = true;
}
if (asc_ordered && desc_order) {
return false;
}
}
return true;
}
7.编写一个模板函数mismatch,返回值是使不等式a[i]≠b[i]成立的最小索引i,0≤i<n。
template <class T>
int mismatch(T* a, T* b, int n)
{
for (int i=0;i<n;++i)
if (a[i]!=b[i])
return i;
return n;
}
8.下面的函数头是具有不同签名的函数吗?为什么?
1) int abc(int a,int b,int c)
2) float abc(int a,int b,int c)
是相同签名(int,int,int),函数签名是由函数的形参类型以及形参个数确定的。
9.假设有一个程序包含了程序1-1和程序1-2的abc函数。下面的语句分别调用了哪一个abc函数?哪一条语句会出现编译错误?为什么?
1)cout<<abc(1,2,3)<<endln; // 调用 int 版本
2)cout<<abc(1.0F,2.0F,3.0F)<<endln; // 调用 float 版本
3)cout<<abc(1,2,3.0F)<<endln; // 报错:调用重载函数不明确
4)cout<<abc(1.0,2.0,3.0)<<endln; // 报错:形参类型是 double 而不是 float
ps:实际执行会报错:无法重载仅按返回类型区分的函数
标签:函数,int,练习,value,第一章,template,实参,模板 From: https://www.cnblogs.com/2333ljy/p/17977718