STl总体概念二

1.迭代器适配器之流迭代器:istream_iterator和ostream_iterator。主要完成收入和输出的迭代操作,例如:copy(istream_iterator<string>(cin),istream_iterator(),back_insertr(coll));//从标准cin中输入若干字符串到指定的cin模板对象中,unique_copy(coll.begin(),coll.end(),ostream_iterator<string>(cout,"\n"));//从coll集合中输出数据到标准输出流cout中(会过滤重复的数据)。后面的"\n"表示会对每一个元素输出中加上一个该字符串,此处表示每次输出换行,次参数可有可无。
2.迭代器适配器之逆向迭代器reverse iterators:主要有2个函数rend()和rbegin()。例如:copy(coll.rbegin(),coll.rend(),ostream_iterator<int>(cout," ")); *coll.rbegin()返回的是最后一个元素的值。注意:*coll.rbegin()和*coll.end()是毫无意义的,编程中应该注意永远不要用*或者->对某个位置并无真正的元素进行处理。

3.修改性算法:对容器可以实现修改或者删除。但是很多时候只是在逻辑上处理了,实际上并未处理。例如:remove(coll.begin(),coll.end(),3);会把值为3的元素用后面的元素依次覆盖,比如原来是654321123456,执行后变成654211245656,他会依次向前面移动,最后2个元素5和6实际上是应该被删除。原因就是是容器和算法的分开,迭代器只是容器某一位置的抽象,迭代器对自己所属容器一无所知,任何以迭代器访问容器的算法都不得透过迭代器调用容器类别所提供的成员函数。remove其实返回了个新的终点,我们可以用这个终点真正的删除元素。list<int>::iterator end=remove(coll.begin(),coll.end(),3);//逻辑删除3  copy(coll.begin(),end,ostream_iterator<int>(cout," "));//打印出来cout<<"删除了多少元素"<<distance(end,coll.end())<<endl;//算出逻辑删除的个数 coll.erase(end,coll.end());//真正删除区间元素,此处erase是容器的内部函数,不是模板算法。

4修改性算法不能用于关联式容器中,因为它会打破原来按照某种规则排序的问题(由于这个原因关联式容器的所有迭代器全部申明为指向常量)。如果我们要删除容器的元素我们可以调用容器本身的函数,例如coll.erase(3)返回删除元素的个数。
5.算法VS成员函数:容器提供的方法可能比算法还好,例如list容器删除元素,用算法remove,其实算法本身不知道自己处理的是list容器,然后就会按照正常流程走;当改变元素值就会从新排列,当删除一个元素,后面的其他元素依次向前移动一个位置,这违反了list(链表)插入,删除,移动元素的优点。但是容器的成员函数却提供了适合这种操作的方法。coll.erase(remove(coll.begin(),coll.end(),3),coll.end());coll.remove(4);上述2种方法都是删除元素,前面先用算法逻辑删除3的元素返回逻辑最后游标后然后通过容器函数erase()物理删除元素,面用的容器的成员函数,直接删除容器的值

6.typename T::const_iterator pos;//定义自己在泛型函数时必须指定传入容器的迭代器(const_iterator 表示是泛型提供的一个类型)

7.以函数作为算法在参数:find_if(),sort(),

8.const函数不能修改对象的字段值,而且const对象只能调用带有const的成员函数,其他对象可以调用正常函数和const函数。

9.仿函数(智能函数)在定义 :在类中定义有方法名为operator的函数

class x{

public:

返回类型 operator(参数列表) const{函数体}

}仿函数和普通函数的区别:(1)仿函数有自己的成员变量也就是具有状态,并且可以再运行的时候初始化它。它在同一时间里有不同的状态(2)每个仿函数有自己的类型。(3)仿函数比一般函数速度快

10.容器元素满足的条件:(1)元素自身必须具有复制构造函数,所有容器都会在内部生成一个元素副本,并返回改暂时性副本,因此拷贝构造函数会频繁调用,如果你的拷贝构造函数比较耗费时间,请用reference来使用容器,避免拷贝任何对象(2)必须有assignment操作符完成赋值操作(3)必须带有西沟函数完成销毁动作。

11.STL不支持引用类型,但是我们可以让容器的对象时指针,这样达到引用的目的,不过得注意引用的对象可能不存在。 STL不支持错误检查,因为STL设计初衷是速度高于安全。170

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值