C++学习笔记——STL总结

本文详细介绍了C++的STL(Standard Template Library),包括其三大核心部分:容器如vector、list、set等,迭代器作为访问容器数据的工具,以及各种算法如排序、查找和拷贝。通过实例展示了如何使用这些工具进行高效编程。
摘要由CSDN通过智能技术生成

C++学习笔记——STL总结

1、简介

STL(Standard Template Library)是C++一个重要的板块,它代表着C++对代码复用性所做出的贡献。STL中提供了常用的基于各种数据类型的基本操作,包括基本的算数运算,逻辑运算,数据存储,访问,排序等在实际开发中会用到的一些操作。STL所用到的技术是模板。

2、STL结构梳理

(a) 总体上STL分为三大部分:容器(container)算法(algorithm)迭代器(iterator)
(b) 容器用来存储数据,通过为容器指定迭代器访问容器内的数据,算法则根据访问到的数据进行运算

2.1容器(container)

所有容器都采用了类模板技术,在创建容器时,需要指定容器所存放的数据类型以及容器名称。在使用容器前,要包含对应的头文件。以下总结几种常用的容器:
(1) string string是C++风格的字符串,本质上是一个类。
(2) vector vector和数据类型非常相似,由于其数据插入只能从尾部开始,也成为单端数组
(3) deque duque容器可以在头部和尾部插入数据,因此称为双端数组
(4) stack stack容器遵循先进后出原则,且只能访问栈顶元素。
(5) queue queue容器遵循先进先出原则,只能访问队头和队尾元素。
(6) list list容器将数据进行链式存储,在数据域中存放数据,在指针域中存放上一个和下一个数据的指针。
(7) set/multiset set容器自动将所有数据进行有序存储(仅有内置数据类型可直接适用),并不允许有重复元素,而multiset允许有重复元素
(8) map/multimap map容器中数据存储的方式是键值对的形式进行存储,且map不允许有重复的键,而multimap允许有重复的键。

2.2 迭代器

迭代器本质上其实是指针变量,它指向容器中的数据,在创建容器后,定义对应指定容器的迭代器。例如:

vector<int> v;
vector<int>::iterator it = v.begin();

deque<int> dq;
deque<int>::iterator it_d = dq.begin();

2.3 算法

STL中的算法主要针对内建数据类型,实现了一些对容器的遍历、查找、排序、拷贝替换等基本功能。以下简单总结常用的一些算法:
(1) 遍历算法
(a) for_each(iterator beg, iterator end, _Func);
在区间beg到end内,对每个元素执行_Func函数操作
(b) transform(iterator beg1, iterator end1, iterator beg2, _func);
在区间beg到end内,对每个元素执行_Func函数操作,并将其转移至另一个容器中。
(2) 查找算法
(a) iterator& find(iterator beg, iterator end, value);
按值value查找元素,找到返回指定元素的位置迭代器,找不到返回结束迭代器end().
(b) iterator& find_if(iterator beg, iterator end, _Pred);
按条件查找元素,找到返回指定位置迭代器,找不到返回迭代器位置,_Pred就是查找的条件
© iterator& adjacent_find(v1.begin(), v1.end());
查找相邻重复元素,找到则返回第一个元素的迭代器位置,找不到则返回结束迭代器。
(d) bool binary_search(iterator beg, iterator end, value);
用二分法查找指定元素value,查找到返回true,否则返回false。注意:该算法只适用于有序容器。
(e) int count(iterator beg, iterator end, value);
统计元素value出现的次数,返回整数。
(f) int count_if(iterator beg, iterator end, _Pred);
统计符合条件的元素的个数,_Pred为判断条件
(3) 排序算法
(a) sort(iterator beg, iterator end, _Pred);
依据谓词_Pred进行排序
(b) random_shuffle(iterator beg, iterator end)
指定范围内的元素随机调整次序
© merge(beg1, end1, beg2, end2, target_beg);
将两个容器合并至一个容器中,target_beg即为目标容器的起始迭代器
(e) reverse(iterator beg, iterator end);
将区间内的元素反转
(4) 拷贝和替换算法
(a) copy(iterator beg, iterator end, iterator target_beg);
将原容器内的元素拷贝到另一个容器中
(b) replace(iterator beg, iterator end, old_value, new_value);
将区间内,所有的old_value替换为new_value
© replace_if(iterator beg, iterator end, _Pred, new_value);
按条件替换元素,满足条件的替换成指定元素
(d) swap(container c1, container c2)
互换两种相同类型的容器
(5) 算数生成算法
注意:算数生成算法需包含头文件“numeric”
(a) T& accumulate(iterator beg, iterator end, value);
累加区间内所有元素的值,起始值为value
(b) fill(iterator beg, iterator end, value)
在区间内填充所有值为value的元素
(6) 集合算法
(a) iterator& set_intersection(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator beg3);
求两个容器的交集,并返回最后一个元素的迭代器位置
(b) iterator& set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator beg3);
求两个容器的并集,并返回最后一个元素的迭代器位置
© iterator& set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator beg3);
求两个容器的差集,并返回最后一个元素的迭代器位置
注意:两个容器的顺序不一样,结果可能不同!
例如:容器1在前,就是容器1对容器2求差集,最后返回的是容器1与容器2不同元素集合的最后一个位置。而且要利用resize方法对目标容器预留空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值