《泛型编程与STL》读书笔记

      通读《泛型编程与STL》,总的感觉是这本书前后反差较大,前半部分非常抽象,后半部分-类似一个API速查手册,相对简单。

      STL主要涉及三个方面:容器,迭代器,算法,各自职责为:容器存数据,迭代器取数据,算法操纵数据。它们之间的简单关系是:算法通过迭代器操作容器,容器通过迭代器访问自身数据元素。可以说,迭代器做到了让算法和容器解耦,同时,模板又做到了让迭代器与数据类型解耦。迭代器起到了关键的桥梁作用。

      迭代器按类型来分可分为五类,名称分别为 InputIterator/OutputIterator/FowardIterator/Bidirectional/RandomAccessIterator。 InputIterator/OutputIterator是功能最简单的迭代器, InputIterator为只读迭代器(读指从容器中取数据),OutputIterator为只写迭代器(写指将数据写入容器), InputIterator/OutputIterator迭代器只支持向前迭代;FowardIterator可读可写,FowardIterator迭代器也是只支持向前迭代;Bidirectional迭代器支持向前向后两个方向迭代,和前三个迭代器相同,一次只能前进一个位移;RandomAccessIterator的迭代器支持+n操作。除了强两个,后三个迭代器都是前一个功能的超集,或者说是前一个的refinement。它们之间的相对关系如下:

 

        举个例子,不同的算法对迭代器的要求可能不同:一般的find算法,只需要一个InputIterator就可以了;对于replace算法,在读的同时还需要写,则至少需要是FowardIterator。下面的例子,square方法中的ForwardIterator可以换成InputIterator或OutputIterator吗?答案是不可以,因为需要可读可写。

 

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>

using namespace std;

template<typename ForwardIterator>
void square(ForwardIterator first, ForwardIterator last)
{
  cout << "Squares:  ";
  for(;first != last; first++) {
    *first = (*first) * (*first);
    cout << *first << " ";
  }
  cout << endl;
}

int main()
{

  int arr[] = {1, 2, 3, 4, 5};

  vector<int> v(arr, arr + sizeof(arr)/sizeof(arr[0]));

  cout << "Elements: ";
  for(auto it : v ) {
    cout << it << " ";
  }
  cout << endl;

  square(v.begin(), v.end());

  return 0;
}

 

 

 

TBD

       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值