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
- STL深入学习笔记01
- STL学习笔记一(深入VC之STL系列)
- STL学习笔记---01
- STL学习笔记-->初识STL
- STL学习笔记--初识STL
- STL之学习笔记
- stl学习笔记1
- stl学习笔记2
- stl学习笔记3
- stl学习笔记4
- stl学习笔记5
- stl学习笔记6
- stl学习笔记7
- stl 学习笔记 8
- stl 学习笔记 9
- stl 学习笔记 10
- stl 学习笔记 11
- stl 学习笔记 12
- [torch]maskzero
- 几种强制转换
- MySql基础总结(一)
- iOS开发入门教程
- Struts1知识点、注意事项总结
- STL深入学习笔记01
- 资料---考试科目
- 第五天:初始化SDRAM 设置S5PV210时钟系统
- 使用sm2签名并验签efi文件
- Linux下修改文件的时间属性
- JavaScript面向对象及原型的理解及笔记整理【一】
- 给控件添加圆角边框
- scala类
- docker容器扫盲