声明:以下练习均为个人编写,非标准答案,可能存在错误,欢迎各位交流讨论,指出错误!
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; if (std::less<T>()(v2, v1)) return -1; return 0; } #endif
|
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
|
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
。