CPP标准模板库 随笔
对于无序容器而言,其次序是不固定的,就算添加一个元素,也可能全盘改变次序。唯一可以保证的是,内容相同的元素会相邻。(eg: 23,1,1,25,3,27,5,7,11,11)
迭代器的种类:
1,前向迭代器(Forward Iterator) 只能够以累加操作符向前迭代。 forward_list 的迭代器属于此类。其他容器如unordered_set , unordered_multiset, unordered_map 和 unordered_multimap也都至少是此类(但标准库其实为他们提供的是双向迭代器)
2,双向迭代器(Bidirectional Iterator)以递增,递减进行前进或者后退。list set multiset map multimap
3, 随机迭代器 (Random-access Iterator) 不但具备双向迭代器能力,还具备随机访问能力。具体的说,它们提供了迭代器算术运算的必要操作符(和寻常指针的算术运算完全对应)。你可以对迭代器增加或减少一个偏移量,计算两个迭代器之间的距离,
或者使用 < 和 > 之类的relational操作符进行比较。vector , deque, array 和 string提供的迭代器都属于此类。
4, 输入型迭代器 (Input Iterator) 向前迭代时能够读取/处理Value。 Input stream 迭代器就是这样一个例子。
5, 输出型迭代器 (Output Iterator) 向前迭代时能够涂写value。Inserter 和 Output stream 迭代器属于此类。
注意,为了写出与具体类型无关的代码,最好不要使用随机访问迭代器的特有操作。例如:
//可以在任何容器使用
for(auto pos = coll.begin(); pos != coll.end(); ++pos){
//...
} //下面这个就不太适用了,list set map 不支持 operator <
for(auto pos = coll.begin(); pos != coll.end(); ++pos){
//...
}
算法
算法并非容器类的成员函数,而且搭配迭代器使用的全局函数。优势是,一次实现,所有容器可操作。大大提高了程序库的能力和弹性,大幅降低了代码量。
注意,这不是OOP思维,而是泛型函数编程思维(generic functional programming paradigm)。缺陷,不似OOP中数据与操作紧密结合,代价是有失直观,其次某些数据结构和算法之间并不兼容。更甚,某些容器和算法虽然勉强兼容却毫无用处。因此,需要了解其缺陷,趋利避害。
迭代器之适配器
迭代器(Iterator)是个纯抽象的概念:任何东西,只要其行为类似迭代器,他就是一个迭代器。CPP标准库提供了数个预定义的特殊迭代器,亦即所谓的 迭代器适配器。它们不仅是辅助性质而已,它们赋予整个迭代器抽象概念更强大的威力。
1,安插型迭代器(Inserter Iterator)
2,串流迭代器 (stream Iterator)
3, 逆向迭代器(Reverse Iterator)
4, 搬移迭代器 (Move Iterator)(since c++11)
Insert Iterator(安插型迭代器)
插入而非覆写。目标区间会增大成长。
int main(){
list<int> coll1 = {,,,};
vector<int> voll2; //把coll1的元素append到coll2中,采用apped
copy( coll1.cbegin(), coll1.cend(),
back_inserter(coll2)); //把coll1 插入 coll3前方,但顺序反向
deque<int> coll3;
copy( coll1.cbegin(), coll1.cend(),
front_inserter(coll3)); //复制coll1 到 coll4,唯一一个可以工作于关联集合的inserter
set<int> coll4;
copy( coll1.cbegin(), coll1.cend(),
inserter(coll4, coll4.begin()));
}
back_inserter(安插于容器末端) 内部调用push_back(),在容器尾部追加元素,适用于vector,deque,list 和 string
front_inserter(安插于容器最前端) 内部调用push_front(),但元素反转。只能用于提供push_front()的容器。适用于deque,list和forword_list。
General inserter,一般性的inserter,作用是“在初始化时接受之第二实参”所指的位置前方插入元素。内部调用insert(),所以STL容器都提供insert()函数,因此这是关联式容器唯一可用的预定义inserter。
stream Iterator (串流迭代器)
该迭代器用来读写stream,其提供了必要的抽象性,使得来自键盘的输入像是个集合,你能够从中读取内容。类似,你也可以把一个算法的输出结果重新导向导某个文件或屏幕上。
#include<iterator>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream> using namespace std; int main(){
vector<string> coll;
//从标准输入读取所有单词
//源:所有string 目的:coll
copy(istream_iterator<string>(cin), // start of source
istream_iterator<string>(), // end of source
back_inserter(cool)); //destination sort(coll.begin(),coll.end()); unique_copy(coll.begin(),coll.end(), //source
ostrem_iterator<string>(cout,"\n")); //destination
}
参考链接:Stream Iterator(流迭代器)
Reverse Iterator (反向迭代器)
reverse iterator是STL中第三种预定义的迭代器适配器,该迭代器将以逆方向的进行所有的操作,它将递增运算(++)转换为递减运算(--),反之亦然。同时所有的容器都可以通过成员运算符rebegin()和rend()产生出 reverse iterators,也就是说反向迭代器是正向迭代器的适配器。
vector<int> iVector;
for (int i = ; i <= ; ++i)
{
iVector.push_back(i);
} copy(iVector.rbegin(), iVector.rend(), ostream_iterator<int>(cout, " "));
//5 4 3 2 1
cout << endl;
采用了reverse iterator迭代器后,copy()算法可以不用特殊处理,可以将++运算转换为--,将前向遍历改变为后向遍历,该程序反向输出vector中的数字序列,输出结果为:5 4 3 2 1。
Move Iterator(搬移迭代器)
来自C++11,后面再讲
更易型算法(manipulating algorithm) 或 变易型算法(mutating algorithm)
更易型算法指的是会“移除或重排或修改”元素的算法,是一组能够修改容器元素数据的模板函数,可进行序列数据的复制、交换、替换、填充、移除、旋转、随机抖动和分割。这些算法对迭代器有较高的要求,具体的迭代器类型随各个算法而定,或前向迭代器、或双向迭代器、又或者是随机迭代器,以提供算法所需要的迭代器操作。应用变易算法时,先要检查容器的迭代器是否符合要求,防止产生编译错误。
更易型算法若用于关联式容器或者无序容器,会出问题,关联式容器和无序容器不能被当作操作目标,原因很简单:如果更易型算法用于它们身上,会改变某些位置上的值,进而破坏容器本身对次序的维护。为避免累及内部次序,关联式容器和无序容器的所有迭代器均被声明为指向常量的value或者key。如果更改,只能调用成员函数。
以函数作为算法的实参
最简单的例子:for_each()算法,它针对区间内的每一个元素,调用一个由用户指定的函数:
void print(int elem){
cout << elem << ' ';
} int main(){
vector<int> coll;
for(int i = ; i <= ;++i){
coll.push_back(i);
} for_each(coll.cbegin(),coll.cend(),print);
cout << endl;
}
另一个例子是:std::transform
函数对象(Function Object)
传递给算法的“函数型实参”不一定得是函数,可以是行为类似函数的对象。这种对象称为函数对象,或者仿函数(functor)
Wikipedia:函数对象
CPP标准模板库 随笔的更多相关文章
- 【c++】标准模板库STL入门简介与常见用法
一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...
- STL 简介,标准模板库
这篇文章是关于C++语言的一个新的扩展--标准模板库的(Standard Template Library),也叫STL. 当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话 ...
- ###STL学习--标准模板库
下面进行STL的学习.希望能了解标准模板库中的常用容器,迭代器,可以自由运用STL以提高编写代码的效率.下面的内容我想以知识点为总结,不再像<Effective C++>那样以章节进行总结 ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
- 如何导出标准模板库(STL)类的实例化和包含STL类对象数据成员的类
本文翻译自 https://support.microsoft.com/zh-cn/help/168958/how-to-export-an-instantiation-of-a-standard-t ...
- C++_标准模板库STL概念介绍1-建立感性认知
标准模板库的英文缩写是STL,即Standard Template Library. STL里面有什么呢? 它提供了一组表示容器.迭代器.函数对象和算法的模板. 容器是一个与数组类似的单元,可以存储若 ...
- 标准模板库(STL)学习指南之List链表
本文转载自天极网,原文地址:http://www.yesky.com/255/1910755.shtml.转载请注明 什么是STL呢?STL就是Standard Template Library,标准 ...
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
随机推荐
- 小D课堂 - 新版本微服务springcloud+Docker教程_3-02CAP理论知识
笔记 2.分布式应用知识CAP理论知识 简介:讲解分布式核心知识CAP理论 CAP定理: 指的是在一个分布式系统中,Consistency(一致性). Availabi ...
- 最短路径:Dijkstra算法 C#
class Program { ; static void Main(string[] args) { Console.WriteLine("各点距离矩阵如下:"); Consol ...
- C基础知识(12):可变参数
该功能需要使用<stdarg.h>.函数的最后一个参数写成省略号,即三个点号(...),省略号之前的那个参数是int,代表了要传递的可变参数的总数.该文件提供了实现可变参数功能的函数和宏. ...
- C语言基础:汉诺塔(递归方法)
分析:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上.当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上,再将A塔上的2号盘子移动的C塔上,最后将B塔上的小盘子移动到C ...
- Day03:日期操作 / 集合框架(上)
日期操作 Java中的时间 · Java中的时间使用标准类库的Date类表示,是用距离一个固定时间点的毫秒数(可正可负,long类型)表达一个特定的时间点: · 固定的时间点叫纪元(epoch),是U ...
- iOS 12.4 越狱已经发布
昨天 unc0ver 3.5.0 发布,支持 iOS 12.4 越狱.12.4 目前为最新版的系统. 下载地址:https://github.com/pwn20wndstuff/Undecimus/r ...
- 【0.3】mysql复制的日常管理维护,mysql复制常见问题处理
[1]复制的日常管理 #复制的日常管理与维护 [1.1]show slave status\G :在从库查看从库线程状态 [1.2]flush tables with read lock; :主从不 ...
- Eclipse中格式化代码
Eclipse中格式化代码快捷键Ctrl+Shift+F失效的解决办法 格式化代码的时候,右键 --> Source --> Format 能够起效,但 Ctrl+Shift+F不好使. ...
- 草地排水 洛谷P2740 最大流 入门题目
草地排水 洛谷P2740 最大流入门题目 题意 在农夫约翰的农场上,每逢下雨,贝茜最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段时间.因此,农夫约翰修建了一 ...
- 2019中山纪念中学夏令营-Day21[JZOJ]
2019中山纪念中学夏令营-Day21[JZOJ] 提高组(B组模拟赛)Team_B (由于本人太弱,并没有订正完题目) (题解大部分是从官方题解文件上摘来的) 日常膜拜大神:じやゆん蒟蒻 正文部分: ...