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
    评论
侯捷的《STL源码剖析》是一本关于STL(标准模板库)的学习笔记。这本书深入解析了STL的实现原理和设计思路,对于理解STL的内部机制和使用方法非常有帮助。这些学习笔记记录了作者在学习侯捷的《STL标准库和泛型编程》课程时的心得和总结,对于理解STL源码和进行泛型编程都具有指导意义。 这本书涉及了STL的各个模块,包括容器、迭代器、算法等,并解释了它们的实现原理和使用方法。通过学习这本书,你可以更好地理解STL的底层实现和使用技巧。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [STLSourceAnalysis:stl原始码剖析(侯捷)的学习笔记](https://download.csdn.net/download/weixin_42175776/16069622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [候捷老师STL源码剖析视频课程笔记](https://blog.csdn.net/weixin_46065476/article/details/125547869)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [侯捷——STL源码剖析 笔记](https://blog.csdn.net/weixin_45067603/article/details/122770539)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值