STl总体概念

1.slt的目的是把数据和操作分离:数据用容器进行管理,操作用算法实现,最后迭代器作为粘合剂把二者无缝连接。这个和面向对象有点背道而驰。

2.容器分为:序列式容器和关联式容器,序列式有(vector,deque,list),我们也可以把strings和array当做一种序列式容器只是非标准,关联式容器有(set,multisets,map,multimap)。

3.push_back(element),siz(),[i]下标法获取或设置值。deque提供push_front(element)方法。list使用的是链表的方式存放数据,因此不能用下标的方式获取元素,而其他2个序列容器可以通过下标获取元素。但是优点是可以在任何地方插入或者删除元素节点,只是查询的时候表其他2个容器的速度慢。list添加了empty()方法判断空,除了提供push_back()添加方法还提供了front()获取前面数据,back()获取后面的元素,pop_fron()和pop_back()从前面和后面删除元素。

4.关联容器在内存中结构以二叉树排列,左子树不大于自己,右子树不小于自己。特殊容器stacks栈(后进先出),queues队列(先进先出),priority queue根据用户函数定义的优先级别获取下一个元素。

5.容器中常用方法 begin() 和end()。每种容器都提供了2种迭代器,一个是可以“读/写”模式的迭代器,另外一种是"只读"模式的迭代器,例如:vector<char>::iterator和vector<char>::const_iterator,在编程时最好在迭代时用前置增量++a,而不是后置增量a++,因为后置增量会创建一个临时对象保存原本位置。

6.在定义完关联容器的时候用insert添加元素时,元素的排序默认是按照>开始的,如果想定义自己的排序规则,则可以自己定义一个伪函数,通过他进行排序。例如:set<int,greater<int>> coll;其中greater是已经定义好的模板排序函数。对于multimap 在增加(insert)时要用make_pair,对于map我们可以用coll["键"]="值"的形式添加。

7.迭代器的种类分为:双向迭代器(主要用于list,set,multiset,map,multimap,可以递增++或者递减--)和随机存取迭代器(主要用于vector,deque,string。除了递增和递减还具有迭代器自身算术运算,比如iter+5,表示移动5个元素,双向迭代器没有此功能)。

8.算法:引入头文件<algorithm>,常用算法min_element(),max_element(),sort()还提供了自定义排序,find(),reverse()以上函数至少要传入2个参数表示函数执行的区间,STL一般采用的半开区间。find()函数当发现不了元素时返回指针将会指向end(),半开区间不会包含最后一个元素,这个说明如果要对最后一个元素操作,我们应该对最后一个元素实行++前置操作。以上函数我们传递的区间必须是第二个指针必须在第一个指针之后,如果不是则系统会出现问题。根据情况有2种出来方式:针对随机迭代访器常用的做法是把区间的2个迭代器进行比较如:if(iter1<iter2){},如果是双向访问迭代器那就只有用起点和该迭代器,该迭代器和终点种找另一个迭代器来确定那个区间是正确的。

9.多区间操作只需提供第一个区间的起始位置,后面的区间根据第一个判断。注意:必须保证第二个或者后面的区间必须至少和第一个区间的个数相等。例如:if(equal(coll1.begin(),coll1.end(),coll2.begin())){...},copy(coll1.begin(),coll1.end(),coll2.begin());上述问题出现了2个解决方案,要么给出正确的区间,要么显示的改变区间大小(coll1.resize()重置大小或者deque<int > coll2(coll1.size())初始化设定大小,会加入默认的值在新增区间中,我们也可以传递额外的参数给构造函数和resize()函数,把新增的区间默认值按照你的想法走),这2个办法只适合于序列化容器(vector,deque,list),因为关联式容器根本就不会出现此种情况。

10.迭代器之配接器:insert iterators(插入迭代器)stream iterators(流迭代器)reverse iterators(逆向迭代器)。

11.insert iterators以插入的方式非覆盖的方式,可以解决目标空间不足,它会增大目标空间。3种插入迭代器back_inserter()元素插入到后面,其实内部使用了push_back(),因此只有提供了该方法的容器才有此功能(vector,list,deque).front_inserter()使元素添加到最前端,内部使用了push_front()使用范围(deque,list);inserter()唯一一个预先定义好的能用于关联式容器的迭代器,内部调用insert()函数,不过对关联式容器安插的顺序只是一个辅助,真正安插在哪儿取决于元素本身,因此有可能给的位置会比默认的效率还低【关联式容器插入后的排序是按照元素本身的,与插入的顺序无关】;





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值