)一个类或函数,可以将一些其他接口转换为STL使用的接口。
#include
…… ostream_iterator
out_iter(cout, " ");//第一个参数指出被发送给输出流的数据类型,第二个参数指出输出流使用的字符类型 copy(dice.begin(),dice.end(),out_iter);
istream_iterator
是istream输入可用做迭代器接口,它是一个输入迭代器概念的模型,使用两个istream_iterator对象来定义copy()的输入范围
copy(istream_iterator
(cin), istream_iterator
(), dice.begin());//第一个参数指出要读取的数据类型,第二个参数指出输入流使用的字符类型
现在假设反向打印容器的内容,vector类有一个名为rbegin()的成员函数和一个名为rend()的成员函数,前者返回一个指向超尾的反向迭代器,后者返回一个指向第一个元素的反向迭代
copy(dice.rbegin(), dice.rend(), out_iter);//反向显示内容
记住rbegin()和end()返回相同的值,但类型不用(reverse_iterator和iterator)同样rend和返回相同的值(指向第一个元素的迭代器),但类型不同。
5)序列
6种STL容器类型,deque、list、queue、priority_queue、stack和vector都是序列,队列能够在队尾添加元素,在队首删除元素,Deque表示的双端队列允许在两端添加和删除元素。
数组和链表都是序列,但分支结构(其中每个节点多指向两个子节点)不是序列。
Xa(n,t); //声明一个名为a的、由n个t值组成的序列
X(n,t); //创建一个由n个t值组成的匿名序列
Xa(i,j);//声明一个名为a的序列,并将其初始化为区间[i,j)的内容
X(i,j);//创建一个匿名序列,并将其初始化为区间[i,j)的内容
a.insert(p,t) //将t插入到p的前面
a.insert(p,n,t) //将n个t插入到p的前面
a.insert(p,i,j) //将区间[i,j)中的元素插入到p的前面
a.erase(p) //删除p指向的元素
a.erase(p,q) //删除区间[p,q]中的元素
a.clear() //等价于erase(begin(),end())
6)下面详细介绍6种序列容器类型
vector
vector是数组的一种类表示,它提供了自动内存管理功能,可以动态地改变vector对象的长度,并随着元素的添加和删除而增大和缩小,它提供了对元素的随机访问,在尾部添加和删除袁术的时候是固定的,但在头部或中间插入和删除元素的复杂度为线性时间。
deque
deque模板类表示双端队列,类似于vector主要区别在于从deque对象的开始位置插入和删除元素的时间是固定的,而不像vector中那样是线性时间。
list
表示双向链表,出了第一个和最后一个元素外,每个元素都与前后的元素相链接,这就意味着可以双向遍历链表。list和vector之间的区别在于list在链表中任一个位置进行插入和删除的时间是固定的,vector强调的是通过随机访问进行快速访问,而list强调的是元素的快速插入和删除。
与vector相似,list也是可以反转容器的,不同的是list不支持数组表示法和随机访问,
queue
queue模板的限制比deque多,它不仅不允许随机访问队列元素,甚至不允许遍历队列。
queue的操作
bool empty() const //如果队列为空,则返回true;否则返回false
size_type size() const //返回队列中元素的数目
T& front() //返回指向队首元素的引用
T& back() //返回指向队尾元素的引用
void push(const T & x) //在队尾插入x
void pop() //删除队首元素
记住如果要使用队列中的值,应首先使用front()来检索这个值,之后我们再用pop()将它从队列中删除。
priority_queue
另一个适配器类,它支持的操作与queue相同,在priority_queue中,最大的元素被移到队首。
stack
记住在头文件中得加上#include
也是一个适配器类,给底层类提供了典型的堆栈接口。
bool empty() const //如果堆栈为空,则返回true;否则返回false
size_type size() const //返回堆栈中元素的数目
T& top() //返回指向栈顶元素的引用
T& back() //返回指向队尾元素的引用
void push(const T & x) //在堆栈顶部插入x
void pop() //删除栈顶元素
如果要使用堆栈中的值,必须首先使用top()来检索这个值,之后使用pop()将它从堆栈中删除。
7)联合容器
优点在它提供了对元素的快速访问,与序列相似,联合容器也允许插入新元素,不过不能指定元素插入位置,原因为联合容器通常包含用于确定数放置位置的算法,以便能够很快的检索信息。
四种:set、multiset、map、multimap
前两个是在头文件#include
后两个是在头文件#include
set
A;
将集合初始化为数组内容的简单方法:
const int N = 6;
string s1[N] = {"buffoon", "thinkers", "for", "heavy", "can", "for"};
set
A(s1, s1 + N);//初始化 记住区间的最后一个位置是超尾,s1 + N指向数组尾部后面的一个位置,集合被排序 ostream_iterator
out(cout, " "); copy(A.begin(), A.end(), out);
求两个集合的并集
set_union(A.begin(), A.end(), B.begin(), B.end(), ostream_iterator
out(cout, " "));
补充:set.intersection()和set_difference()函数查找交集(两个集合公有的元素)和获得两个集合的差(第一个集合减去两个集合公有的元素)
两个有用的set方法分别是lower_bound()和upper_bound()
lower_bound()方法将关键字作为参数并返回一个迭代器,该迭代器指向集合中第一个不小于关键字参数的成员,同样,upper_bound()返回的位第一个大于关键字参数的成员
multimap
可反转,可排序,关键字是可以与多个值关联
创建一个multimap对象,其中关键字的类型是int,所存储的值的类型为string
multimap
codes;
为了将信息结合在一起,实际的值类型将关键字类型和数据类型结合为一对,STL使用pair
模板类将这两种值存储到一个对象中,如果keytype是关键字类型,而打她type是被存储的数据类型
pair
创建一个匿名pair对象,并将它插入
codes.insert(pair
(213, "Los A