STL标准模板 算法 迭代器

STL标准模板

序列容器
向量类模板
vector
向量(vector)是一种随机访问的数组类型,提供了对数组元素的快速、随机访问,以及在序列尾部快速、随机的插入和删除操作。它是大小可变的向量,在需要时可以改变其大小。
使用向量类模板需要创建vector对象,创建vector对象有以下几种方法:
std::vector name;
std::vector name(size);
std::vector name(size,value);
std::vector name(myvector);
std::vector name(first,last);
vector对象主要成员函数说明
函 数 说 明
assign(first,last) 用迭代器first和last所辖范围内的元素替换向量元素
assign(num.val) 用val的num个副本替换向量元素
at(n) 返回向量中第n个位置元素的值
back 返回对向量末尾元素的引用
begin 返回指向向量中第一个元素的迭代器
capcity 返回当前向量最多可以容纳的元素个数
clear 删除向量中所有元素
empty 如果向量为空,则返回true值
end 返回指向向量中最后一个元素的迭代器
erase(start,end) 删除迭代器start和end所辖范围内的向量元素
erase(i) 删除迭代器i所指向的向量元素
front 返回对向量起始元素的引用
insert(i,x) 把值x插入向量中由迭代器i所指明的位置
insert(i,start,end) 把迭代器start和end所辖范围内的元素插入到向量中由迭代器i所指明的位置
insert(i,n,x) 把x的n个副本插入到向量中由迭代器i所指明的位置
max_size 返回向量的最大容量(最多可以容纳的元素个数)
pop_back 删除向量最后一个元素
push_back(x) 把值x放在向量末尾
rbegin 返回一个反向迭代器,指向向量末尾元素之后
rend 返回一个反向迭代器,指向向量起始元素
reverse 颠倒元素的顺序
resize(n,x) 重新设置向量大小n,新元素的值初始化为x
size 返回向量的大小(元素的个数)
swap(vector) 交换两个向量的内容

双端队列类模板
双端队列(deque)是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,它可以在需要的时候修改其自身的大小,主要完成标准C++数据结构中队列的功能。
使用双端队列类模板需要创建deque对象,创建deque对象有以下几种方法:
std::deque name;
std::deque name(size);
std::deque name(size,value);
std::deque name(mydeque);
std::deque name(first,last);

deque对象主要成员函数说明
函 数 说 明
assign(first,last) 用迭代器first和last所辖范围内的元素替换双端队列元素
assign(num.val) 用val的num个副本替换双端队列元素
at(n) 返回双端队列中第n个位置元素的值
back 返回一个对双端队列最后一个元素的引用
begin 返回指向双端队列中第一个元素的迭代器
clear 删除双端队列中所有元素
empty 如果双端队列为空,则返回true值
end 返回指向双端队列最后一个元素的迭代器
erase(start,end) 删除迭代器start和end所辖范围内的双端队列元素
erase(i) 删除迭代器i所指向的双端队列元素
front 返回一个对双端队列第一个元素的引用
insert(i,x) 把值x插入向量中由迭代器i所指明的位置
insert(i,start,end) 把迭代器start和end所辖范围内的元素插入到双端队列中由迭代器i所指明的位置
insert(i,n,x) 把x的n个副本插入到双端队列中由迭代器i所指明的位置
max_size 返回双端队列的最大容量(最多可以容纳的元素个数)
pop_back 删除双端队列最后一个元素
pop_front 删除双端队列第一个元素
push_back(x) 把值x放在双端队列末尾
push_front(x) 把值x放在双端队列开始
rbegin 返回一个反向迭代器,指向双端队列最后一个元素之后
rend 返回一个反向迭代器,指向双端队列第一个元素
resize(n,x) 重新设置双端队列大小n,新元素的值初始化为x
size 返回双端队列的大小(元素的个数)
swap(vector) 交换两个双端队列的内容

链表类模板
链表(list),即双向链表容器,它不支持随机访问,访问链表元素要指针从链表的某个端点开始,插入和删除操作所花费的时间是固定的,和该元素在链表中的位置无关。list在任何位置插入和删除动作都很快,不像vector只在末尾进行操作。

使用链表类模板需要创建list对象,创建list对象有以下几种方法:
std::list name;
std::list name(size);
std::list name(size,value);
std::list name(mylist);
std::list name(first,last);
list对象主要成员函数说明
函 数 说 明
assign(first,last) 用迭代器first和last所辖范围内的元素替换链表元素
assign(num.val) 用val的num个副本替换链表元素
back 返回一个对链表最后一个元素的引用
begin 返回指向链表中第一个元素的迭代器
clear 删除双链表中所有元素
empty 如果链表为空,则返回true值
end 返回指向链表最后一个元素的迭代器
erase(start,end) 删除迭代器start和end所辖范围内的链表元素
erase(i) 删除迭代器i所指向的链表元素
front 返回一个对链表第一个元素的引用
insert(i,x) 把值x插入链表中由迭代器i所指明的位置
insert(i,start,end) 把迭代器start和end所辖范围内的元素插入到链表中由迭代器i所指明的位置
insert(i,n,x) 把x的n个副本插入到链表中由迭代器i所指明的位置
max_size 返回链表的最大容量(最多可以容纳的元素个数)
pop_back 删除链表最后一个元素
pop_front 删除链表第一个元素
push_back(x) 把值x放在链表末尾
push_front(x) 把值x放在链表开始
rbegin 返回一个反向迭代器,指向链表最后一个元素之后
rend 返回一个反向迭代器,指向链表第一个元素
resize(n,x) 重新设置链表大小n,新元素的值初始化为x
reverse 颠倒链表元素的顺序
size 返回链表的大小(元素的个数)
swap(listref) 交换两个链表的内容
swap(vector) 交换两个链表的内容

结合容器

set类模板
set类模板又称为集合类模板,一个集合对象像链表一样顺序地存储一组值。在一个集合中,集合元素既充当存储的数据,又充当数据的关键码。
可以使用下面的几种方法来创建set对象:
std::set<type,predicate> name;
std::set<type,predicate> name(myset)
std::set<type,predicate> name(first,last)
set类中方法说明
函 数 说 明
begin 返回指向集合中第一个元素的迭代器
clear 删除集合中所有元素
cout(x) 返回集合中值为x(0或1)的元素个数
empty 如果集合为空,则返回true值
end 返回指向集合中最后一个元素的迭代器
equal_range(x) 返回表示x下界和上界的两个迭代器,下界表示集合中第一个值等于x的元素,上界表示第一个值大于x的元素
erase(i) 删除由迭代器i所指向的集合元素
erase(start,end) 删除由迭代器start和end所指范围内的集合元素
erase(x) 删除集合中值为x的元素
find(x) 返回一个指向x的迭代器。如果x不存在,返回的迭代器等于end
insert(i,x) 把值x插入集合。x的插入位置从迭代器i所指明的元素处开始查找
insert(start,end) 把迭代器start和end所指范围内的值插入集合中
insert(x) 把x插入集合
lower_bound(x) 返回一个迭代器,指向位于x之前且紧邻x的元素
max_size 返回集合的最大容量
rbegin 返回一个反向迭代器,指向集合最后一个元素
rend 返回一个反向迭代器,指向集合的第一个元素
size 返回集合的大小
swap(set) 交换两个集合的内容
upper_bound(x) 返回一个指向x的迭代器
value_comp 返回value_compare类型的对象,该对象用于判断集合中元素的先后次序

mulltiset类模板
multiset使程序能顺序存储一组数据。与集合类类似,多重集合的元素既可以作为存储的数据又可以作为数据的关键字。然而,与集合类不同的是多重集合类可以包含重复的数据。下面列出了几种创建多重集合的方法:
std::multiset<type,predicate> name;
std:: multiset <type,predicate> name(mymultiset)
std:: multiset <type,predicate> name(first,last)
multiset类中方法说明
函 数 说 明
begin 返回指向集合中第一个元素的迭代器
clear 删除集合中所有元素
cout(x) 返回集合中值为x(0或1)的元素个数
empty 如果集合为空,则返回true值
end 返回指向集合中最后一个元素的迭代器
equal_range(x) 返回表示x下界和上界的两个迭代器,下界表示集合中第一个值等于x的元素,上界表示第一个值大于x的元素
erase(i) 删除由迭代器i所指向的集合元素
erase(start,end) 删除由迭代器start和end所指范围内的集合元素
erase(x) 删除集合中值为x的元素
find(x) 返回一个指向x的迭代器。如果x不存在,返回的迭代器等于end
insert(i,x) 把值x插入集合。x的插入位置从迭代器i所指明的元素处开始查找
insert(start,end) 把迭代器start和end所指范围内的值插入集合中
insert(x) 把x插入集合
lower_bound(x) 返回一个迭代器,指向位于x之前且紧邻x的元素
max_size 返回集合的最大容量
rbegin 返回一个反向迭代器,指向集合最后一个元素
rend 返回一个反向迭代器,指向集合的第一个元素
size 返回集合的大小
swap(set) 交换两个集合的内容
upper_bound(x) 返回一个指向x的迭代器
value_comp 返回value_compare类型的对象,该对象用于判断集合中元素的先后次序

map类模板
map对象按顺序存储一组值,其中每个元素与一个检索关键码关联。map与set和multiset不同,set和multiset中元素既被作为存储的数据又被作为数据的关键值,而map类型中元素的数据和关键值是分开的。
创建map类模板的方法如下:
map<key,type,predicate> name;
map<key,type,predicate> name(mymap);
map<key,type,predicate> name(first,last);

multimap类模板
multimap能够顺序存储一组值,它与map相同的是每一个元素都包含一个关键值以及与之联系的数据项,与map不同的是多重映射可以包含重复的数据值,并且不能使用[]操作符向多重映射中插入元素。

构造multimap类模板方法如下:
multimap<key,type,predicate> name;
multimap<key,type,predicate> name(mymap);
multimap<key,type,predicate> name(first,last);

算法

函 数 说 明
adjacent_find(first,last) 搜索相邻的重复元素
count(first,last,val) 计数
equal(first,last,first2) 判断是否相等
find(first,last,val) 搜索
find_end(first,last,first2,last2) 搜索某个子序列的最后一次出现地点
find_first(first,last,first2,last2) 搜索某些元素的首次出现地点
for_each(first,last,func) 对first到last范围内的各个元素执行函数func定义的操作
mismatch(first,last,first2) 找出不吻合点
search(first,last,first2,last2) 搜索某个子序列
merge(first,last,first2,last2,result) 合并两个序列
min(val1,val2) 最小值
min_elemnent(first,last) 最小值所在位置
next_permutation(first,last) 获得下一个排列组合
nth_element(first,nth,last) 重新排序列中第n个元素的左右两端
partial_sort_copy(first,last,first2,last2) 局部排序并复制到其他位置
partial_sort(first,middle,last) 局部排序
pop_heap(first,last) 从heap内取出一个元素
prev_permutation(first,last) 改变迭代器first和last指明范围内的元素排列,使新排列是下一个比原排列小的排列,此函数的另一个版本以谓词作为第3个实参
push_heap(first,last) 将一个元素压入heap
set_difference(first,last,first2,last2,result) 获得前一个排列组合
set_intersection(first,last,first2,last2,result)交集
set_symmetric_difference(first,last,first2,last2,result)差集
set_union(first,last,first2,last2,result) 联集
sort(first,last) 排序
sort_heap(first,last) 对heap排序
stable_sort(first,last) 排序并保持等值元素的相对次序
upper_bound(first,last,val) 上限

数值算法
函 数 说 明
accumulate(first,last,init) 元素累加
inner_product(first,last,first2,init) 内积
partial_sum(first,last,result) 局部总和
adjacent_difference(first,last,result) 相邻元素的差额

迭代器

迭代器相当于指向容器元素的指针,它在容器内可以向前移动,也可以做向前或向后双向移动。有专为输入元素准备的迭代器,有专为输出元素准备的迭代器,还有可以进行随机操作的迭代器,这为访问容器提供了通用方法。

输出迭代器
输出迭代器只用于写一个序列,它可以进行递增和提取操作。
在这里插入图片描述
在这里插入图片描述
输入迭代器
输入迭代器只用于读一个序列,它可以进行递增、提取和比较操作。

在这里插入图片描述
在这里插入图片描述
前向迭代器
前向迭代器既可用于读,也可用于写,它不仅具有输入和输出迭代器的功能,还具有保存其值的功能,从而能够从迭代器原来的位置开始重新遍历序列。
在这里插入图片描述
在这里插入图片描述

双向迭代器
双向迭代器既可用于读,也可用于写,它与前向迭代器类似,只是双向迭代器可做递增和递减操作。

在这里插入图片描述
在这里插入图片描述
随机访问迭代器
随机访问迭代器是最强大的迭代器类型,不仅具有双向迭代器的所有功能,还能使用指针的算术运算和所有比较运算。
在这里插入图片描述
在这里插入图片描述
总结
本章主要介绍了标准模板库中的容器、算法和迭代器。这三者是标准模板库的核心内容,并且相互联系非常密切。迭代器是访问容器中的元素,算法是对容器中的元素进行操作。每种容器都有各自的特点,只有熟练掌握这些特点才能将标准模板库的作用充分发挥,并且应尽可能多地使用标准模板库提供的算法,这样可以节省许多开发时间。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值