chapter8_编写泛型函数

  1. 示例

     template<class T>
     T median(std::vector<T> v) {
    
         typedef typename std::vector<T>::size_type vec_sz;
    
         vec_sz size = v.size();
    
         std::sort(v.begin(), v.end());
         vec_sz mid = size / 2;
    
         return (size & 1) == 0 ? (v[mid] + v[mid - 1]) / 2 : v[mid];
     }
    
    1. template – 模板头

      告诉系统环境,定义的是一个模板函数

    2. typedef typename std::vector::size_type vec_sz;

      告诉系统环境,整个名称当作一个环境来处理

      如果我们在声明中使用了由模板类型参数定义的类型,那么就必须用关键字 typename 来限定这个声明

  2. 模板实例化

    1. 实例化动作通常在链接期间发生,而不是在编译期间发生

      只有模板被实例化了,系统环境才能证实,模板代码能被用于指定的类型,因此在链接期间,我们就可以发现那些看起来在编译期间可能发生的错误

    2. 为了对一个模板进行实例化,系统环境要求模板的定义+声明必须是系统环境可以访问的 ----> 模板的头文件和源文件都要可以访问 ----> 模板的头文件直接写模板定义,或者在头文件#include “sourceFile.cpp”,否则会报错

  3. 迭代器

    扫描二维码关注公众号,回复: 8569869 查看本文章
    1. 分为 5 种

      (1) 输入迭代器

      按一个方向顺序访问,只能输入

      所有容器的迭代器都支持

      (2) 输出迭代器

      按一个方向顺序访问,只能输出

      所有容器的迭代器都支持

      (3) 正向迭代器

      按一个方向顺序访问,既能输入也能输出

      所有容器的迭代器都支持

      (4) 双向迭代器

      按两个方向顺序访问,既能输入也能输出

      所有容器的迭代器都支持

      (5) 随机访问迭代器

      能有效访问任何元素,既能输入也能输出

      vector和string的迭代器支持

    2. 迭代器区间 [begin, end) 的原因

      (1) 当区间无元素时,无法找到最后一个元素标记终点

      (2) 只需判定相等/不相等即可,无需定义小于操作

      (3) 可以自然表示“区间外”的概念

    3. 标准库提供了可以被连接到输入流和输出流的迭代器

      (1) 用于 istream 的迭代器满足了输入迭代器的要求

           vector<int> v;
      
           // 从标准输入中读取整数值,并添加到v中
           copy(istream_iterator<int>(cin), istream_iterator<int>(), back_inserter(v));
      

      (2) 用于 ostream 的迭代器满足了输出迭代器的要求

           vector<int> v;
      
           // 输出v的元素,元素之间用空格分隔
           copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));
      
    4. 使用迭代器可以提高适应性

      示例

           template<class Out>
           void split(const string &str, Out os) {
      
               typedef string::const_iterator iter;
      
               iter i = str.begin();
      
               while (i != str.end()) {
      
                   i = find_if(i, str.end(), not_space);
      
                   iter j = find_if(i, str.end(), space);
      
                   if (i!=str.end()) {
                       *os++ = string(i, j);
                   }
      
                   i = j;
               }
           }
      

      这个方法的作用是将提取一句话中的各个单词,使用了迭代器的好处是提供了统一的接口,可以输出到任何容器类型中:

           string s = "I'm a good man";
           split(s, back_inserter(word_list));
      

      通过 back_inserter,可以获取任何容器的目标位置,而不必关心容器本身是 vector 还是 list

发布了391 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/captxb/article/details/103052968
今日推荐