Effective STL学习记录

1.istreambuf_iterator的用法:

        可以像istream_iterator一样使用istreambuf_iterator,但istream_iterator<char>对象使用operator>>来从输入流中读取单个字符。istreambuf_iterator<char>对象进入流的缓冲区并直接读取下一个字符。更明确地说,一个istreambuf_iterator<char>对象从一个istream s中读取会调用s.rdbuf()->sgets()读s的下一个符。不忽略任何字符的读取例子:

        ifstream inputFile("interstingData.txt");

        string fileData((istreambuf_iterator<char>(inputFile)), istreambuf_iterator<char>());


2.back_inserter、front_inserter和inserter的用法:

        int transmogrify(int x);

        vector<int> values;       // 把数据放入results

       ......

        vector<int> results

        transform(value.begin(), values.end(), back_inserter(results), transmogify);    // 在results的结尾插入返回的values

 在内部,back_inserter返回的迭代器会调用push_back,所以可以在任何提供push_back的容器上使用back_inserter(任何标准序列容器:vector、string、deque、list)。如果让一个算法在容器的前端插入东西,可以使用front_inserter。在内部,front_inserter利用了push_front,所以front_inserter只和提供那个成员函数的容器配合(deque和list)。

    

        inserter允许你强制算法把它们的结果插入容器中的任意位置:

transform(value.begin(), values.end(), inserter(results, results.begin() + results.size()/2), transmogify); 


3.真的想删除东西就在类似remove的算法后接上erase:

        从容器中除去一个元素的唯一方法是调用那个容器的一个成员函数。而remove算法接收指定化操作的元素区间的一对迭代器,因为没有办法从一个迭代器获取对应于它的容器,所以remove不可能发现容器,所以remove不可能从一个容器中除去元素。

        remove的操作结果:从一个容器中remove元素不会改变容器中元素的个数。

       所以一般用算法remove和成员函数erase结合来真下删除元素,但list的成员函数是例外,但整合了2者。另外unique与remove类似的行为特性。


4.可适配的函数对象和不可适配的函数对象。

       一些组件要求一些typedef有效,提供这些必要的typedef的函数对象称为可适配的,而缺乏那些typedef的函数对象不可适配。四个标准函数适配器(not1、not2、bind1st、bind2nd)都需要存在某些typedef,一些非标准STL兼容的适配器(比如来自SGI和Boost的)也需要。可适配的比不可适配的函数对象可以用于更多的场景,所以只要能做到就应使函数对象可适配。

        规则:传给unary_function或binary_function的非指针类型都去掉了const和引用。用于带有或返回指针的仿函数的一般规则是传给unary_function或binary_function的类型是operator()带有或返回的类型。


5.

   STL里的一个普遍习惯:函数和函数对象总使用用于非成员函数的语法形式调用。
   因此,mem_fun和mem_fun_ref存在是为了让成员函数使用调用成员函数的语法来处理。


6.

        条款45,count和find是线性时间的,但有序区间的搜索算法(binary_search、lower_bound、upper_bound和equal_range)是对数时间的。

        从无序区间迁移到有序区间导致了另一个迁移:从使用相等来判断两个值是否相同到使用等价来判断。


7.条款49:

         在一个const成员函数内部,类的所有非静态数据成员都变成常量!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值