STL深入学习笔记01

STL深入学习笔记01


背景:

我是一名普通的大学生,入学一年时间。在这一年时间里面过的还算充实,大一选择了acm集训队,学习到了很多算法知识。在这个过程中,我基本上使用过了stl标准函数库里面的大多数常用的容器,也经常用到一些简单的算法,比如sort()。暑假前我决定以后主要学习服务器开发了,用的语言是C++,我觉得过去一个学期里面,我C++学得实在不咋地,于是想通过学习STL的内部原理来进一步充实自己的C++知识,也能进一步锻炼算法能力。
然后要说的就是,我从网上下了一本《泛型编程于STL》,看了开头的几页后觉得对自己的启发很大,于是萌生了将这本书看完的想法,为了巩固自己学到的知识,我决定将里面我觉得很有参考价值的部分做一下解析,写出一个系列博客出来。废话不多说,先贴代码:


代码:

#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>         // 注意,千万别忘了这个头文件,否则无法对迭代器进行扩充

using namespace std;

class line_iterator
{
private:
    istream *in;            // 输入流
    string line;            // 读取到的字符串
    bool is_valid;          // 是否读取完
    void read() {           // 读取一行字符串,使用了getline函数
        if (*in)
            getline(*in, line);
        is_valid = (*in) ? true : false;    // 如果输入流为空的话,就赋值为false,表名读取完毕的状态
    }
public:
    typedef input_iterator_tag iterator_category;
    typedef string value_type;
    typedef ptrdiff_t difference_type;
    typedef const string *pointer;
    typedef const string &reference;

    line_iterator():in(&cin), is_valid(false) {}
    line_iterator(istream &s):in(&s) {
        read();
    }
    reference operator*() const {           // 通常情况下迭代器都会重载*号,用去取值
        return line;
    }
    pointer operator ->() const {           // 同上,取数据地址
        return &line;
    }
    line_iterator operator ++()             // 重载自增运算符,同时都去下一行
    {
        read();         // 读取下一行
        return *this;   // 前置自增运算符返回的是已经自增后的迭代器
    }
    line_iterator operator++(int) {
        line_iterator tmp = *this;
        read();
        return tmp;     // 后置自增运算符返回的自增前的迭代器
    }
    bool operator ==(const line_iterator &i) const {        // 重载判断符,在这个程序中,一下两个运算符的重载其实无关紧要
        return (in == i.in && is_valid == i.is_valid) ||
            (is_valid == false && i.is_valid == false);
    }
    bool operator !=(const line_iterator &i) const {
        return !(*this == i);
    }
};

int main()
{
    line_iterator iter(cin);        // 调用的是第二种构造函数
    line_iterator end_of_file;      // 调用的是第一种构造函数
    vector<string> V(iter, end_of_file);    // vector的一种构造方式,形参是两个迭代器,表示迭代器的区间
    sort(V.begin(), V.end());       // 然后对vector进行排序
    // copy,一种特殊的算法,可以将迭代器区间里面的数据输出到输出流里面
    copy(V.begin(), V.end(), ostream_iterator<string>(cout, "\n"));

    return 0;
}




特别说明:

在这篇系列博客中的程序我都是linux环境下写的,所以在windows环境下运行不起来的话,很正常(^_^)。快投入我大linux党的怀抱中吧




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值