STL
STL容器
顺序容器
顺序容器主要介绍3种,即vector、list、deque,相应的头文件为:
#include<vector>
#include<list>
#include<deque>
C<T> c;
创建一个名为 c 的空容器。C 是容器类型名,如 vector,list,
T 是元素类型,如 int 或 string。适用于所有容器。
C<T> c(c2);
创建容器 c2 的副本 c;c 和 c2 必须具有相同的容器类型,
并存放相同类型的元素。适用于所有容器。
C<T> c(b, e);
创建 c,其元素是迭代器 b 和 e 标示的范围内元素的副本。适用于所有容器。
C<T> c(n, t);
用 n 个值为 t 的元素创建容器 c,其中值 t 必须是容器类型 C 的元素类型的值,
或者是可转换为该类型的值。
C<T> c(n);
只适用于顺序容器,创建有 n 个值初始化元素的容器 c。
栈
先进后出
队列
先进先出
优先队列
priority_queue的声明:
std::priority_queue<type, container, comp> pri_que;
声明实例:
priority_queue<int, vector<int>, greater<int> > pri_que;
priority_queue 模板类有三个模板参数,第一个是元素类型,
第二个是保存数据的容器,第三个是比较方式。其中后两个都可以省略,
默认容器为vector,默认的比较方式是数值上的小于关系,
即用operator<,此时队列中元素由队头到队尾从大到小排列,如果把后面两个参数缺省的话,
优先队列就是大根堆,队头元素最大。(注意这里的大根堆并不是数据结构意义上的大根堆。
priority_queue只是保证第一个结点最大)
关联容器
pair
略
map
map的构造函数
在定义map对象时,必须分别指明键和值的类型。Map建立key-value的一种映射。
1.map<key, value> m;
创建一个名为m的空map对象,其键和值的类分别为key和value。
2.map<key, value> m(m2);
创建m2的副本m,m与m2必须有相同的键类型和值类型。
3.map<key, value> m(b,e);
创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本,元素的类型必须能转换为pair
4.map<key, value, comp> mp;
comp可选,为键值对存放策略,即键的比较函数,默认标准库使用键类型定义的 < 操作符来实现键的比较。所用的比较函数必须在键类型上定义严格的弱排序,可将其理解为键类型数据上的“小于”关系。在实际应用中,键类型必须能定义 < 操作符。对于键类型,其唯一的约束就是必须支持 < 操作符。
map<key, value> ::key_type;
在map容器中,用作索引的键的类型
map<key, value> ::mapped_type;
在map容器中,键所关联的值的类型
map<key, value> ::value_type;
一个pair类型,
它的first元素const map<key, value> ::key_type类型,
而second元素则为map<key, value> :: mapped_type类型。
给map容器添加元素可通过两种方式实现:
1.通过insert成员函数实现。
2.通过下标操作符获取元素,然后给获取的元素赋值。
map对象的访问可通过下标和迭代器两种方式实现:
1.map的下标是键,返回的是特定键所关联的值。
2.使用迭代器访问,iter->first指向元素的键,iter->second指向键对应的值。
用下标访问map中不存在的元素将导致在map容器中添加一个新的元素,这个元素的键即为该下标值,键所对应的值为空。
m.count(k); // 返回m中键值等于k的元素的个数。
m.find(k); // 如果m中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回结束游标end()
m.erase(k); // 删除m中键为k的元素,返回size_type类型的值,表示删除元素的个数。
m.erase(p); // 从m中删除迭代器p所指向的元素,p必须指向m中确实存在的元素,而且不能等于m.end(),返回void类型。
m.erase(iterator first, iterator last); // 删除一个范围,返回void类型
m.insert(e);
e是一个用在m上的value_type类型的值。如果键e.first不在m中,
则插入一个值为e.second的新元素;如果该键在m中已存在,那么不进行任何操作。
该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,
以及一个bool类型的对象,表示是否插入了该元素。
m.insert(beg,end);
beg和end是标记元素范围的迭代器,对于该范围内的所有元素,
如果它的键在m中不存在,则将该键及其关联的值插入到m。 返回void类型。
m.insert(iter,e);
e是value_type类型的值,如果e.first不在m中,则创建新元素,
并以迭代器iter为起点搜索新元素存储的位置,返回一个迭代器,指向m中具有给定键的元素。
在添加新的map元素时,使用insert成员可避免使用下标操作符带来的副作用:不必要的初始化。
set
Map容器是键值对的集合,而set容器只是单纯的键的集合,当只想知道一个值是否存在时,使用set容器是最合适的。在set中,所有元素都会根据其键值被自动排序,同时set中不允许两个元素有相同的键值。
1、set容器的一些操作
Set容器支持大部分的map操作,主要包括以下几种操作:
###1、声明set对象
set<T> s; // 创建一个名为s的空set,T是类型名。
set<T> s(s2); // 创建容器s2的副本s。
set<T> s(b, e); // 创建s,其元素是迭代器b和e标示的范围内元素的副本。
2、set的插入操作
s.insert(key_value);
/*将key_value插入到set中,返回值是pair<set<int>::iterator, bool>,
bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,
则iterator表示key_value在set中的位置。如果key_value不存在,则插入;
否则不进行任何操作。*/
s.insert(iter, key_value);
//在指定的迭代器位置插入key_value,返回该迭代器。
s.insert(begin, end);
//将迭代器begin到end之间的元素插入到set中,返回值是void。
3、set的访问操作
s.find(k);
/*如果查找到键值k,则返回该键值的迭代器位置;否则,
返回集合最后一个元素后面的一个位置,即end()。*/
4、set的删除操作
s.erase(key_value); // 删除键值为v的值
s.erase(iter); // 删除迭代器iter所指向的元素
s.erase(iterator first, iterator last); // 删除两个迭代器之间的值
5、set与大部分容器通用的一些方法:
begin(); // 返回set容器的第一个元素。
end(); // 返回set容器的最后一个元素的下一个位置。
clear(); // 删除set容器中的所有的元素。
empty(); // 判断set容器是否为空。
max_size(); // 返回set容器可能包含的元素最大个数。
size(); // 返回当前set容器中的元素个数。
rbegin(); // 返回set容器的最后一个元素。
rend(); // 返回set容器的第一个元素的前一个位置。

浙公网安备 33010602011771号