(Boolan) STL与泛型编程第四周笔记(上)

1 STL组建(STL Components)
关键组建:容器,迭代器,算法
STL的基本观念就是将数据和操作分离,数据由容器类加以管理,操作则由可定制的算法定义之,迭代器在两者之间充当粘合剂,使任何算法都可以和任何容器交互运作
2 容器(Containers)和迭代器
迭代器的分类:
1 双向迭代器:
可以双向进行,以递增运算前进或以递减运算符后退(list set multiset map multimap 均提供此类迭代器)
2随机存期迭代器:
随机存取迭代器具备双向迭代器的所有有属性还具备随机访问能力:vector deque string
3之间差异:
For(pos=coll.begin();pos!=coll.end();++pos) { ………………… } For(pos=coll.begin();pos<coll.end();++pos) ………
只有随机访问迭代器才支持operation<<; 所以代码一般会写成第一种
容器相关函数:
reverse()将区间能元素翻转
coll2.resize(coll.size());//改变coll2元素个数
deque<int>coll3(coll1.size());初始化时指明要有的足够空间
六迭代器之配接器:
(一)三种迭代器配接器:
1 Insert iterators(安插型迭代器)
2stream iterators(流迭代器)
3Reverse iterators(逆向迭代器)
安插型迭代器:
Inset iterators 可以使算法以安插的方式而非覆写方式运作可以解决算法的“目标空间不足”的问题是的它会促使目标区间的大小按需要成长
如果对某个元素设值会引发所属群集的安插操作,至于插入位置在容器的最前还是最后或是某个指定位置上,需要视三种情况而定:
(1) 单步前进不造成任何动静
1.1 Back inserters(安插于容器最尾端)
Back inseters 内部调用push_back()在容器尾端插入元素

Copy(coll1.begin(),coll1.end(),back_inserter(coll2)
(只有vector deque list提供push_back())

2.2 Front Inserters(安插于容器最前端)
Copy(coll1.begin(),coll1.end(),front_inserter(coll3));

这种动作逆转了被安插元素的次序如果先安插1再向前安插2那么1会在2后边提供push_front的容器只有:deque list
2.3 Generalinerters(一般性安插器):
一般性的inserters它的作用是将元素插入初始化时接受第二个参数的位置的前方inserters 内部调用成员函数insert()并以新值和新位置做参数所有STL容器都提供insert()函数
(2)Stream Iterator(流迭代器)

copy(istream_iterator<string>(cin),istream_iterator<string>(),back_inserter(coll));
sort(coll.begin(),coll.end());
unique_copy(coll.begin(),coll.end(),ostream_iterator<string>(cout,"\n"));

2.1istream_iterator<string>(cin)
这个产生一个可从标准输入流cin读取数据的streamiterator

2.2 istream_iterator<string>()
调用istreamiterator 的default构造函数产生一个代表”流结束”符号的迭代器它表示你不能在从中读取任何东西

2.3 ostream_iterator<string>(cout,”\n”)
产生一个output stream iterator,透过operator<<向cout写入strings第二个参数作为元素之间分割符

(2) Reverse Iterator(逆向迭代器)
逆向方式进行操作
所有容器都可以通过成员函数rbegin()和rend()产生出reverse iterator
(二)更易型算法(manipulatingalgorithm删除或重排或修改元素的算法)
1 算法remove()自某个区间删除元素

for(inti=1;i<=6;++i)
    {
        coll.push_front(i);
        coll.push_back(i);
 
    }
remove(coll.begin(),coll.end(),3);
结果:654211245656

数值为3删除后被其后元素覆盖,至于群集尾端那些违背覆盖的元素,原封不动但从逻辑上说,那些元素已经不属于这个群集了
改进:

List<int>::iterator end=remove(coll.begin(),coll.end(),3)
copy(coll.begin()end,ostream_iterator<int>(cout,","));
结果:6542112456

或者采用:
Distance(end,coll.end());
Distance()是返回两个迭代器之间的距离
如果真想把删除的元素斩草除根你必须调用该容器的相应成员函数容器提供成员函数erase()适用此目的erase()可以删除“参数所指示区间”内的全部元素
2更易型算法和相关容器
Erase()成员函数返回删除元素的个数
(三)以函数作为算法的参数

void print(intelem)
{
    cout<<elem<<" ";
}
for_each(coll.begin(),coll.end(),print);

2判断式(predicate)
所谓predicate就是返回布尔值的函数他们通常用来指定排序规则和搜索准则,并非任何返回bool值得一元函数或二元函数就是合法的predicate STL要求面对相同的值predicate必须得出相同的结果,这条戒律将那些“被调用时会改变自己内部状态的函数排除了”
3仿函数(functors,FunctionObject即函数对象)
传递给算法的“函数参数”不一定是函数,可以是行为类似函数的对象
仿函数的优点:
(1) 智能型含糊 smart point
仿函数可拥有成员函数和成员变量这意味着仿函数拥有状态,其次你可以在初始时初始化他们,当然必须在他们被调用之前
(2) 仿函数都有自己的型别(可以设计函数继承体系)
(3) 仿函数比一般函数要快
预定义的仿函数:
Set<int>coll;会被扩展为set<int,less<int>>coll;
所以反向排列这些元素可以是set<int,greater<int>>coll;
透过一些特殊函数配接器你可以将预定义的仿函数和其它数值组合到一起或使用特殊状况
例如:
Transform(coll.begin(),coll.end(),back_inserter(coll2),bind2d(mltiiplies<int>(),10)
将coll中的所有元素乘以10后安插到coll2中这里使用配接器使得multiple<int>运算时以源群集的元素作为第一个参数,10作为第二个参数
仿函数一般声明为:inline
特殊仿函数:

For_each(coll.begin(),coll.end(),mem_fun_ref(&Person::save());

仿函数mem_fun_ref用来调用他所作用的元素的某个成员函数
(四)容器内的元素
1 容器元素的条件
(1)必须可以通过copy构造函数进行复制,copy函数的性能尽可能优化
(2)必须可以透过assignment操作符完成赋值操作(即=号)
(3)必须可以通过析构函数完成销毁动作析构函数决不能设计成preivate
析构函数决不能抛出异常
(4) 对于序列式容器而言,元素的default构造函数必须可用
(5) 对于某些动作必须定义operatpor==以执行相等测试
(6)在关联式容器中元素必须定义排序准则缺省情况下operator<透过仿函数less<>调用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容