STL(1)

一、 STL的四种基本组件
1. 容器(container)
容器是包含容纳一组元素的对象。容器类库包括7种基本容器:向量(vector),双端队列(deque),列表(list),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。
其中,向量,双端队列,列表属于顺序容器,而映射和集合属于关联容器。
2. 迭代器(iterator)
迭代器提供了顺序访问容器中每个元素的方法,可以将它理解为一个泛型指针,对迭代器可以使用“++”运算符来获得指向下一个元素的迭代器,使用“*”运算符访问一个迭代器所指向的元素。
使用独立于STL容器的迭代器需要包含头文件
3. 函数对象(function object)
函数对象是一个行为类似函数的对象,它可以像调用函数一样调用。任何普通的函数和任何重载了“()”运算符的类的对象都可以作为函数对象使用,函数对象是泛化的函数。
使用STL的函数对象需要包含头文件
4. 算法(algorithm)
这里的算法很多,它们的特点是统一性,并且可以广泛用于不同的对象和内置的数据类型。
STL把迭代器作为算法的参数,通过迭代器来访问容器而不是把容器直接作为算法的参数;STL把函数对象作为算法的参数而不是把函数所执行的运算作为算法的一部分。

二、迭代器
1. 输入流迭代器
用来从一个输入流中连续的输入某种数据类型,它是一个类模板。
例如:templateistream_iterator;
T是使用该迭代器从输入流中输入数据的类型。它需要满足两个条件:
要有默认的构造函数;对该类型的数据可以用“>>”从输入流输入。
输入流迭代器由istream_iterator(istream &in)这个构造函数来构造。
输入迭代器有“==”,“!=”,”*”, “->”功能。
2. 输出迭代器
用来向一个输出流中连续输出某种数据类型,它也是一个类模板。
例如:templateostream_iterator(T)
T是使用该迭代器向输出流中输出数据的类型。它要有一个功能:对该类型的数据可以用“<<”向输出流输出。
输出迭代器可以用下面两个构造函数来构造:
ostream_iterator(ostream &out);
ostream_iterator(ostream &out, const char *delimiter);
参数delimiter是可选的,表示输出数据之间的分隔符。
*p = t向迭代器所指向的位置写入一个元素,返回类型不确定
3.前向迭代器
它是输入迭代器和输出迭代器这两个概念的子概念,它既支持数据读取,也支持数据写入,支持对序列进行可重复的单向遍历。
4. 双向迭代器
它是单向迭代器的子概念,在单向迭代器所支持的功能的基础上,又支持迭代器的反向移动。
–p1 可以使用前置“–”使迭代器指向上一个元素,返回值为p1自身的引用。 p1–可以使用后置“–”使迭代器指向上一个元素,返回值类型为X
5. 随机访问迭代器
它是双向迭代器的子概念。在双向迭代器的基础上,它支持直接将迭代器向前或向后移动n个元素。

三、 容器
设S表示一个容器类,s1,s2是S类的实例。则容器的功能如下:
S s1 容器的默认构造函数,用于构造一个没有任何元素的空容器
s1 op s2 op代表==,!=,<, >等运算符
s1.begin() 返回指向s1第一个元素的迭代器
s1.end() 返回指向s1最后一个元素的下一个位置的迭代器
s1.clear() 将容器s1的 内容清空
s1.size() 返回s1的元素个数
s1.swap(s2) 将s1容器和s2容器的内容交换

s1.rbegin() 得到指向容器的最后一个元素的逆向迭代器
s1.rend() 得到指向容器的第一个元素的前一个位置的逆向迭代器

  1. 顺序容器
    构造函数:
    S s(n, t) 构造一个由n个t元素构成的容器实例
    S s(n) 构造一个有n个元素的容器实例s,每个元素都是T()
    S s(q1,q2) 使用区间 [q1,q2)内的数据作为s的元素构造s
    赋值函数:
    s.assign(n,t) 给容器赋n个t
    s.assign(n) 给容器赋n个元素每个元素都是T()
    s.assign(q1,q2) 用区间 [q1,q2)之间的元素给容器赋值
    元素插入:
    s.insert(p1, t) 在容器的p1位置插入元素t
    s.insert(p1, n, t) 在容器p1位置插入n个t
    s.insert(p1,q1,q2) 将[q1,q2)区间的元素插入到容器p1位置处
    元素的删除:
    s.erase(p1) 删除容器p1位置处的元素,返回被删除的下一个元素的迭代器
    s.erase(p1,p2) 删除 [p1,p2)区间内的元素,返回最后一个被删除元素的下一个元素迭代器。
    改变容器的大小:
    s1.resize(n) 将容器的大小变为n,如果容器的元素个数大于n,则末尾多余的元素将会被删除,若小于n,则末尾将会用T()填充
    首尾元素的直接访问:
    s.front() s.back()
    在容器头部、尾部插入、删除元素:
    s.push_front(t) s.pop_front()
    s.push_back(t) s.pop_back()

三种顺序容器的比较:
如果要执行大量的随机访问操作,并且当扩展容器时只需要向容器末尾加入新的元素,选择向量容器vector
如果需要少量的随机访问操作,需要在容器两端插入或删除元素,选择双端队列容器deque
如果不需要对容器进行随机访问,却需要在容器中间位置插入或删除元素,应当选择容器list

  1. 关联容器
    对于关联容器,它的每一个元素都有一个键,容器中的元素顺序是按照键的取值升序排列的。关联容器键之间必须能够使用“<”比大小。如果键类型是int, double等基本数据类型,比较操作自然可以完成如果键类型是类类型,则需要重载“<”运算符。
    构造函数:
    S s(q1,q2) 使用区间 [q1,q2)内的数据作为s的元素构造s
    元素的插入:
    s.insert( t) 在容器中插入元素t
    元素的删除:
    s.erase(p1) 删除p1所指的元素
    s.erase(p1, p2) 删除 [p1,p2)区间的元素
    s.erase(k) 删除所有键值为k的元素, 返回被删除元素的个数
    基于键的查找和计数
    s.find(k) 找到任意一个键值为k的元素,返回该元素的迭代器,若没有的话返回s.end()
    s.lower_bound(k) 得到s中第一个键值不小于k的元素的迭代器
    s.upper_bound(k) 得到s中第一个键值不大于k的元素的迭代器
    s.count(k) 统计容器中键值为k的元素的个数

集合(set)
集合中不包含重复的元素,元素个数有限,集合的元素本身是有序的,因此可以高效查找指定元素。

映射(map)
映射与集合的区别:集合的元素类型是键本身,而映射的元素类型是由键和附加数据所构成的二元组。这样,在集合中按照键查找一个元素时,一般只适用于确定这个元素是否存在,而在映射中按键查找一个元素时除了能确定元素的存在性还能得到相应的附加数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值