C++练习-16章·1-10

声明:以下练习均为个人编写,非标准答案,可能存在错误,欢迎各位交流讨论,指出错误!

16.1 实例化的定义

调用一个函数模板时,编译器用函数实参来为我们推断模板实参,使用模板实参的类型来确定绑定到模板参数T的类型建立出模板的一个新实例

16.2编写并测试你自己版本的compare函数。

head.h

1
2
3
4
5
6
7
8
9
10
11
#ifndef compare_h
#define compare_h
#include<functional>

template <typename T>
int compare(const T& v1, const T& v2) {
if (std::less<T>()(v1, v2)) return 1;//这里相当于使用()生成less<T>的临时可调用对象
if (std::less<T>()(v2, v1)) return -1;
return 0;
}
#endif // !compare_h

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
#include<string>
#include<vector>
#include<functional>
#include"head.h"
using namespace std;

int main(int argc, char** argv)
{
cout << compare('a', 'b') << endl;
cout << compare(4, 4) << endl;
cout << compare(6, 5) << endl;
}

16.3对两个Sales_data对象调用compare函数,观察编译器在实例化过程中如何处理错误。

找不到Sales_data放哪了,下次补上。

16.4编写类似find算法的模板。使用函数在一个vector<int>和list<string>中查找给定值

findkey.h

1
2
3
4
5
6
7
8
9
10
11
12
#ifndef find_h
#define find_h

template <typename T, typename X>
const T findkey(const T& beg, const T& ed, const X& key) {
for (auto ik = beg; ik != ed; ++ik) {
if (*ik == key)
return ik;
}
return ed;
}
#endif // !find_h

main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include"findkey.h"

using namespace std;

int main(int argc, char** argv)
{
vector<int> a = { 1,2,3,4,5,6,7,8,9,0 };
list<string> b = { "'a","b","c","d","e","f" };

auto pw = findkey(a.begin(), a.end(), 5);
if (pw != a.end())
cout << *pw << endl;
else
cout << "no find" << endl;

auto ps = findkey(b.begin(), b.end(), "k");
if (ps != b.end())
cout << *ps << endl;
else
cout << "no find" << endl;
}

16.5-7

这几个太简单了,以后有时间再补

16.8 为什么C++程序员喜欢用!=而不喜欢<。解释原因。

因为大部分的类型都定义了!=运算符,但是不一定定义<运算符

16.9什么是函数模板?什么是类模板?

函数模板是一个可用来生成针对特定类型的函数版本的公式。类模板则是生成特定的类,但是不能想函数模板那样推断参数类型,需要使用尖括号提供。

16.10当一个类模板被实例化时,会发生什么?

编译器将会重写该模板,并将模板参数T的每个实例替换为给定的模板实参,例如int