《C++标准程序库》读书笔记二
5.Standard Template Library
1、STL组件主要包括三部分:容器、迭代器与算法。
2、容器分为二类:
(1)序列式容器,如vector, deque, list。元素的次序取决于插入次序。
(2)关联式容器,由二叉树实作而成。如set/multiset, map/multimap。元素的次序取决于元素值。
3、vector:在后面插入元素很方便,但是在前端或中部插入元素需要移动其他元素。
deque:在前端或者后端插入元素很方便,在中间插入元素需要移动其他元素。
list:在任何位置上执行安插或者删除动作都很方便,非常迅速,因为只需要改变连接links即可。尤其在中间位置移动元素比vector和deque快得多。但是list不提供operator[]直接存取元素的能力,不支持随机访问。可以调用list.front()/list.pop_front()访问首个元素。
3、容器配接器
(1)Stack,对元素采用LIFO(后进先出)管理策略。
(2)queue,对元素采用FIFO(先进先出)管理策略,相当于普通的缓冲区buffer。
(2)priority queue,容器中的元素可以拥有不同的优先权。所谓优先权,即基于程序员提供的排序准则(缺省使用operator<)而定义。效果等同于:下一个元素永远是queue中优先级最高的元素“,如果同时有多个元素具备最高优先权,则其次序无明确定义。
4、常用的一些算法函数:min_element, max_element, find, sort, reverse等。
5、equal(v1.begin(),v1.end(), v2.begin());
6、三种迭代器配接器:
(1)insert iterator;
1)Back inserters(安插于容器最尾端),内部调用了push_back,适用于vector,deque,list. back_inserter(container)
int arr[5] = {1, 2 ,3, 4, 5};
Vector<int> v1(arr, arr+5);
Vector<int> v2;
Copy(v1.begin(), v1.end(), back_inserter(v2));
2)Front inserters(安插于容器最前端),内部调用了push_front, 适用于deque,list这些提供了push_front()成员函数的容器。front_inserter(container)
list<int> l2;
Copy(v1.begin(), v1.end(), front_inserter(l2));//v2-> 5,4,3,2,1
3)General inserters(一般性安插器): inserter(container, pos),所有容器都可以用,而且这种inserter是唯一可用于关联式容器身上的一种预先定义好的inserter。
set<int> s;
copy(v1.begin(), v1.end(), inserter(s,s.begin()));
(2)流迭代器stream iterator
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespacestd;
int _tmain(intargc,_TCHAR*argv[])
{
vector<string>coll;
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"));
return 0;
}
(3)逆向迭代器reverse iterator;使用rbegin()和rend()实现逆向。