练习16.9

函数模板:一个函数模板就是一个公式,可用来生成针对特定类型的函数版本

类模板:类模板是用来生成类的蓝图的

练习16.10

当一个类模板被实例化后,他的每个实例都形成一个独立的类。

练习16.11

 1 template<typename elemType> class ListItem;
 2 template<typename elemType> class List {
 3 public:
 4     List<elemType> ();
 5     List<elemType>(const List<elemType> &);
 6     List<elemType>& operator=(const List<elemType> &);
 7     ~List();
 8     void insert(ListItem<elemType> *ptr, elemType value);
 9 private:
10     ListItem<elemType> *front, *end;
11 };

ListItem类的类型没有说明;

练习16.12

  1 #include <iostream>
  2 #include <string>
  3 #include <utility>
  4 #include <memory>
  5 #include <vector>
  6 #include <list>
  7
  8 using namespace std;
  9
 10 template <typename T> class BlobPtr;
 11
 12 template<typename T> class Blob {
 13     friend class BlobPtr<T>;
 14 public:
 15     typedef vector<string>::size_type size_type;
 16     Blob();
 17     Blob(initializer_list<T> il);
 18     size_type size() const { return data->size(); }
 19     bool empty() const { return  data->empty(); }
 20     void push_back(const T &t) { data->push_back(t); }
 21     void push_back(T&& t) { data->push_back(std::move(t)); }
 22     void pop_back();
 23     T& front();
 24     T& back();
 25     T& operator[](size_type i);
 26 private:
 27     shared_ptr<vector<T>> data;
 28     void check(size_type i, const string &msg) const;
 29 };
 30
 31 template <typename T> class BlobPtr {
 32 public:
 33     BlobPtr() : curr(0) {}
 34     BlobPtr(Blob<T> &a, size_t sz = 0) : wptr(a.data), curr(sz) {}
 35     T& deref() const;
 36     BlobPtr<T>& incr();
 37 private:
 38     shared_ptr<vector<T>> check(size_t, const string&) const;
 39     weak_ptr<vector<T>> wptr;
 40     size_t curr;
 41 };
 42
 43 int main()
 44 {
 45     Blob<string> b1;
 46     b1.push_back("asdasd");
 47     cout << b1.front() << endl;
 48     BlobPtr<string> b(b1);
 49     auto p = b.deref();
 50     cout << p << endl;
 51     b1.pop_back();
 52     system("pause");
 53     return 0;
 54 }
 55
 56 template<typename T>
 57 Blob<T>::Blob() : data(make_shared<vector<T>>()){}
 58
 59 template<typename T>
 60 Blob<T>::Blob(initializer_list<T> il) : data(make_shared<vector<T>>(il)) {}
 61
 62 template<typename T>
 63 void Blob<T>::pop_back()
 64 {
 65     check(0, "pop_back on empty Blob");
 66     data->pop_back();
 67 }
 68
 69 template<typename T>
 70 T & Blob<T>::front()
 71 {
 72     check(0, "front on empty Blob");
 73     return data->front();
 74     // TODO: 在此处插入 return 语句
 75 }
 76
 77 template<typename T>
 78 T & Blob<T>::back()
 79 {
 80     check(0, "back on empty Blob");
 81     return data->back();
 82     // TODO: 在此处插入 return 语句
 83 }
 84
 85 template<typename T>
 86 T & Blob<T>::operator[](size_type i)
 87 {
 88     check(i, "subscript out of range");
 89     return (*data)[i];
 90     // TODO: 在此处插入 return 语句
 91 }
 92
 93 template<typename T>
 94 void Blob<T>::check(size_type i, const string & msg) const
 95 {
 96     if (i >= data->size())
 97         throw out_of_range(msg);
 98 }
 99
100 template<typename T>
101 T & BlobPtr<T>::deref() const
102 {
103     auto p = check(curr, "dereference past end");
104     return (*p)[curr];
105     // TODO: 在此处插入 return 语句
106 }
107
108 template<typename T>
109 BlobPtr<T> & BlobPtr<T>::incr()
110 {
111     check(curr, "increment past end of BlobPtr<T>");
112     ++curr;
113     return *this;
114     // TODO: 在此处插入 return 语句
115 }
116
117 template<typename T>
118 shared_ptr<vector<T>> BlobPtr<T>::check(size_t i, const string &msg) const
119 {
120     auto ret = wptr.lock();
121     if (!ret)
122         throw runtime_error("unbound BlobPtr<T>");
123     if (i >= ret->size())
124         throw out_of_range(msg);
125     return ret;
126 }

练习16.13

将BlobPtr设置为Blob的友元

练习16.14、练习16.15

 1 #include <iostream>
 2 #include <string>
 3 #include <utility>
 4 #include <memory>
 5 #include <vector>
 6 #include <list>
 7
 8 using namespace std;
 9
10 template <typename T> class Screen {
11     friend istream& operator>><T> (istream& is, Screen<T>& s);
12     friend ostream& operator<<<T> (ostream& os, const Screen<T>& s);
13 public:
14     Screen() = default;
15 private:
16     T height;
17     T width;
18 };
19
20 template <typename T>
21 istream& operator>> (istream& is, Screen<T>& s);
22 template <typename T>
23 ostream& operator<< (ostream& os, const Screen<T>& s);
24
25 int main()
26 {
27     Screen<double> s1;
28     cin >> s1;
29     cout << s1;
30     system("pause");
31     return 0;
32 }
33
34 template<typename T>
35 istream & operator >> (istream & is, Screen<T>& s)
36 {
37     is >> s.height >> s.width;
38     if (!is)
39         s = Screen<T>();
40     return is;
41     // TODO: 在此处插入 return 语句
42 }
43
44 template<typename T>
45 ostream & operator<<(ostream & os, const Screen<T>& s)
46 {
47     os << s.height << " " << s.width;
48     return os;
49     // TODO: 在此处插入 return 语句
50 }

练习16.16

  1 #include <iostream>
  2 #include <string>
  3 #include <utility>
  4 #include <memory>
  5 #include <vector>
  6 #include <list>
  7
  8 using namespace std;
  9
 10 template <typename T> class Vec {
 11 public:
 12     Vec() : elements(nullptr), first_free(nullptr), cap(nullptr) {}
 13     Vec(const Vec<T>& v);
 14     Vec<T>& operator==(Vec<T>& v);
 15     ~Vec();
 16     void push_back(const T&);
 17     size_t size() const { return first_free - elements; }
 18     size_t capacity() const { return cap - elements; }
 19     T* begin() const { return elements; }
 20     T* end() const { return first_free; }
 21 private:
 22     static allocator<T> alloc;
 23     void chk_n_alloc()
 24     {
 25         if (size() == capacity()) reallocate();
 26     }
 27     pair<T*, T*> alloc_n_copy(const T*, const T*);
 28     void free();
 29     void reallocate();
 30     T* elements;
 31     T* first_free;
 32     T* cap;
 33 };
 34
 35 template <typename T> allocator<T> Vec<T>::alloc;
 36
 37 int main()
 38 {
 39     Vec<string> v1;
 40     v1.push_back("sda");
 41     cout << v1.size() << endl;
 42     system("pause");
 43     return 0;
 44 }
 45
 46 template<typename T>
 47 Vec<T>::Vec(const Vec<T>& v)
 48 {
 49     auto newdata = alloc_n_copy(v.begin(), v.end());
 50     elements = newdata.first;
 51     first_free = cap = newdata.second;
 52 }
 53
 54 template<typename T>
 55 Vec<T> & Vec<T>::operator==(Vec<T>& v)
 56 {
 57     auto data = alloc_n_copy(v.begin(), v.end());
 58     free();
 59     elements = data.first;
 60     first_free = cap = data.second;
 61     return *this;
 62     // TODO: 在此处插入 return 语句
 63 }
 64
 65 template<typename T>
 66 Vec<T>::~Vec()
 67 {
 68     free();
 69 }
 70
 71 template<typename T>
 72 void Vec<T>::push_back(const T &s)
 73 {
 74     chk_n_alloc();
 75     alloc.construct(first_free++, s);
 76 }
 77
 78 template<typename T>
 79 pair<T*, T*> Vec<T>::alloc_n_copy(const T *b, const T *e)
 80 {
 81     auto data = alloc.allocate(e - b);
 82     return { data, uninitialized_copy(b, e, data) };
 83 }
 84
 85 template<typename T>
 86 void Vec<T>::free()
 87 {
 88     if (elements)
 89         for (auto p = first_free; p != elements;)
 90             alloc.destroy(--p);
 91     alloc.deallocate(elements, capacity());
 92 }
 93
 94 template<typename T>
 95 void Vec<T>::reallocate()
 96 {
 97     auto newcapacity = size() ? 2 * size() : 1;
 98     auto newdata = alloc.allocate(newcapacity);
 99     auto dest = newdata;
100     auto elem = elements;
101     for (size_t i = 0; i != size(); ++i)
102         alloc.construct(dest++, std::move(*elem++));
103     free();
104     elements = newdata;
105     first_free = dest;
106     cap = elements + newcapacity;
107 }

转载于:https://www.cnblogs.com/wuyinfenghappy/p/7568419.html

C++primer 16.1.2节练习相关推荐

  1. 16 `bs对象.节点名div.属性contents` children descendants 获取子节点 子孙节点

    16 bs对象.节点名div.属性contents children descendants 获取子节点 子孙节点 文章目录 16 `bs对象.节点名div.属性contents` children ...

  2. 微养日记董事长唐新萍女士特邀出席2022年第16届中国品牌节播

    8月7日,以"开放与奋进"为主题的2022第十六届中国品牌节年会在长沙北辰国际会议中心盛大开幕.全国政协副主席.民革中央常务副主席郑建邦通过视频向活动致辞.省委常委.市委书记吴桂英 ...

  3. C++primer 9.2.1节练习

    练习9.3 迭代器begin和end必须指向相同的容器,end可以与begin指向相同的位置,但不能指向begin之前的位置: 练习9.4 1 #include <iostream> 2 ...

  4. C++primer 10.2.1节练习

    练习10.3 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include <s ...

  5. C++primer 13.1.6节练习

    练习13.18 1 #include <iostream> 2 #include <string> 3 #include <memory> 4 5 using na ...

  6. 《C++ Primer》7.2节练习

    练习7.16: 在类的定义中,可以包含0个或者多个访问说明符,并且对于某个访问说明符能出现多少次以及能出现在哪里都没有严格规定.每个访问说明符指定接下来的成员的访问级别,有效范围直到出现下一个访问说明 ...

  7. C++primer 13.6.2节练习

    练习13.49 13.50 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #in ...

  8. C++primer 9.3.3节练习

    练习9.25 如果elem1和elem2相等,则什么都不会发生,因为elem1是要删除的第一个元素,而elem2是删除最后一个元素的后一个位置,所以什么都不会发生: 如果elem2是尾后迭代器,那么删 ...

  9. C++primer 9.5.5节练习

    练习9.50 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 5 using namesp ...

最新文章

  1. 事务隔离机制原理分析以及是否可以防止订单超卖
  2. MapReduce_wordcount
  3. 假设你有一个多层感知机网络(MLP),输入层有10个节点、一个单隐层共50个神经元,最后是一个3个神经元的输出层。请问网络的结构是什么样子的使用数学形式进行描述?
  4. 社团部部长工作计划计算机学院,社团部部长工作计划(共8篇).doc
  5. 明明表中有这个索引,但mysql的force index 无效?
  6. 苹果11怎么关掉横屏_苹果手机这些常规操作你可能不会!教你省电又省心?
  7. excel 宏编程_在 Excel 中使用 Python 开发宏脚本
  8. axios get传参_axios 传数组或对象格式的参数用GET和POST的区别
  9. LiveVideoStack主编观察03 /大会见闻思考
  10. 关于JFace中的向导式对话框(WizardDialog类)
  11. python课程ppt_Python电子教学课件12程序设计基本方法.ppt
  12. 学到了一个一分不亏的地推妙招
  13. 力扣-525 连续数组
  14. Url传递中文终极解决办法
  15. 计算机win10无法打开小键盘,win10数字小键盘开机不启动解决方法
  16. 地图与定位(LBS)-MapKit篇
  17. CSS三列布局(五种方式)
  18. 身为IT人你应该知道的几个威客网站【转】
  19. android平板能玩吃鸡吗,吃鸡不卡的安卓平板
  20. 2022新前端面试题(中高级)

热门文章

  1. mysql less2,实测Aurora Serverless MySQL
  2. 浏览器崩溃_安装谷歌浏览器后打开网页时出现页面崩溃的解决办法
  3. java方法_Java方法
  4. python print_Python print()
  5. ScalaReact式编程书
  6. sqrt numpy_NumPy sqrt()–矩阵元素的平方根
  7. ThreadPoolExecutor – Java线程池示例
  8. 异步回调发展(地狱回调)
  9. 微服务化浪潮中,网易考拉借浪拉动业务极速增长
  10. 「洛谷P3469」[POI2008]BLO-Blockade 解题报告