STL深入学习笔记01

来源:互联网 发布:董小飒淘宝店赚钱吗 编辑:程序博客网 时间:2024/06/11 22:38

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
原创粉丝点击