STL简单介绍

参考:https://www.tianmaying.com/tutorial/cpp-stl-introduction

定义

STL(Standard Template Library)提供了一些常用的数据结构和算法的模板,1998年加入C++标准。STL中有三个重要的概念:

  1. 容器:容纳各种数据类型的数据结构,是一系列的类模板。
  2. 迭代器:迭代器用来迭代地访问容器中的元素
  3. 算法:用来操作容器中的元素,是一系列的函数模板

容器

STL中的容器定义在std命名空间下,需要引入头文件<vector>,<set>,<map>,<list>,<deque>,<stack>等。容器可以分为三大类:

  • 顺序容器

(1)vector:尾端插入元素有较高性能,动态数组实现

(2)deque:首尾插入元素都有较高性能,动态数组实现

(3)list:可以常数时间在任何地方插入元素,链表实现

  • 关联容器

(1)set:不同元素的集合,平衡二叉树实现,检索时间是O(log(N));

(2)multiset:同上,但可以包含相同元数据;

(3)map:同set,但存放的是键值对;

(4)multimap:同上,键可以重复;

  • 容器适配器:stack、queue、priority_queue。

上述容器通用方法有:empty、size、swap、max_size,前两类容器支持迭代器,成为第一类容器。顺序容器还有以下通用方法:front、back、pop_back、push_back。其中,front()和back()返回的是容器的首尾元素的引用。

容器之间的比较取决于第一个不等的元素,如果长度相同且所有元素相等,两个容器相等;如果一个是另一个的子序列,则较短的容器小于较长的容器。

容器适配器是逻辑数据结构,需要用一种顺序容器来实现。例如,stack默认使用deque来实现,也可指定它的实现方式。

例如:

stack<string> strstk;        //string型栈,deque实现

stack<int, vector<int>> stk;       //int型栈,vector实现

迭代器

参考:https://blog.csdn.net/yupu56/article/details/43968013

参考:https://blog.csdn.net/summerxiachen/article/details/59538640

迭代器(Iterator)是一种检查容器内元素并遍历元素的数据类型。迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。标准库为每一种标准容器(包括vector)定义了一种迭代器类型。对于有序的容器如list、vector,我们可以采用索引的方式进行访问,但对于无序的set、map该如何遍历寻找?迭代器的访问方式,就是把不同集合的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。迭代器类型提供了比下标更通用化的方法,对所有容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素,及时对支持下标操作的vector类型也是这样。只有第一类容器支持迭代器(容器适配器不支持迭代器)。

迭代器分类

参考:https://www.jianshu.com/p/8a51cf91a293

参考:https://www.cnblogs.com/lhuan/p/5706654.html

No.类型功能举例
1输入迭代器(Input Iterator)提供只读访问istream
2

输出迭代器(Output Iterator)

提供只写访问ostream
3前向迭代器(Forward Iterator)支持逐个向后迭代访问forward_list、unordered_set、unordered_multiset、unordered_map、unordered_multimap
4双向迭代器(Bidirectional Iterator)能够双向地逐个迭代访问list、map、set、multiset、multimap
5随机访问迭代器(Random-Access Iterator)可随机访问每个元素vector、array、deque、string、内置数组

迭代器操作

  • begin和end操作

vector<int>::iterator iter = ivec.begin();//返回的迭代器指向容器的第一个元素

vector<int>::iterator itel = ivec.end();//返回的迭代器指向容器的末端元素的下一个,“超出末端迭代器”(off-the-end iterator),表明它指向了一个不存在的元素。它只起一个哨兵(sentinel)的作用,表示我们已处理完vector内的所有元素。

如果vector为空,begin返回的迭代器与end返回的相同。

  • 自增和解引用运算

解引用操作符(dereference operator)(*)来访问迭代器所指向的元素

*iter = 0;//将迭代器iter指向的元素置0.

迭代器使用自增操作符向前移动迭代器指向容器中下一个元素

++iter;

  • 遍历容器

for(vector<int>::iterator iter= ivec.begin(); iter != ivec.end(); ++iter)

    *iter = 0;

const_iterator

每种容器均定义了该类型的迭代器,只能用于读取容器内元素,但不能改变其值,不要把const_iterator对象与const的iterator对象混淆起来

算法

参考:https://blog.csdn.net/wanghairong2015/article/details/53053616

STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用STL中的算法函数必须包含头文件<alogrithm>,例如查找、插入、删除、排序等,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象。

STL算法大致分为四类:

  1. 非可变序列算法:指不直接修改其所操作的容器内容的算法
  2. 可变序列算法:值可以修改它们所操作的容器内容的算法
  3. 排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作
  4. 数值算法:对容器内容进行数值计算

STL算法有70个,其中查找算法--13个,排序和通用算法--14个(提供元素排序策略),删除和替换算法--15个,排列组合算法--2个(提供计算给定集合按一定顺序的所有可能排列组合),算术算法--4个,生成和异变算法--6个,关系算法--8个,集合算法--4个,堆算法--4个

例如:

变化序列的:copy、remove、reverse、fill、replace、swap。。。

不变化序列的:find、count、for_each、equal。。。

代码实现,find用值来搜索一个元素的迭代器

vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<int>::iterator p = find(v.begin(), v.end(), 3);
if(p != v.end()) cout<<*p;
// 3

代码实现,copy用来做容器之间的拷贝:

ostream_iterator<int> output(cout, " ");
copy(v.begin(), v.end(), output);
// 1 2 3

代码实现,erase用来删除一个区间的元素:

v.erase(v.begin(), v.end());
// 等效于
v.clear();

代码实现,lower_bound(FwdIt f, FwdIt l, const T& val)用来给出小于val的坐标上限(前闭后开)。 upper_bound(FwdIt f, FwdIt l, const T& val)用来给出大于val的坐标下限(前闭后开):

std::map<char,int> mymap;
std::map<char,int>::iterator itlow,itup;

mymap['a']=20;
mymap['b']=40;
mymap['c']=60;
mymap['d']=80;
mymap['e']=100;

itlow=mymap.lower_bound ('b');  // itlow points to b
itup=mymap.upper_bound ('d');   // itup points to e (not d!)

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值