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党的怀抱中吧