C++ STL的用法(基础)

C++ STL

STL组件

Container(容器) 各种基本数据结构

容器类是容纳、包含一组元素或元素集合的对象
异类容器类与同类容器类
顺序容器与关联容器
七种基本容器:
向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)

顺序容器——向量(vector)
向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)
数据结构很像一个数组,所以与其他容器相比,vector 能非常方便和高效访问单个元素,支持随机访问迭代子
向量是动态结构,它的大小不固定,可以在程序运行时增加或减少

向量类与数组的不同
与数组不同,向量的内存用尽时,向量自动分配更大的连续内存区,将原先的元素复制到新的内存区,并释放旧的内存区。这是向量类的优点。

vertor的使用方法
#include
(1)头文件
#include.
(2)创建vector对象,
vector vec;
(3)尾部插入数字:
vec.push_back(a);
(4)使用下标访问元素
cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素:
vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素:
vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:
vec.size();
vec.resize;改变大小
(9)清空:
vec.clear();

顺序容器——双端队列 (deque)
头文件:#include
双端队列是一种放松了访问权限的队列。元素可以从队列的两端入队和出队,也支持通过下标操作符“[]”进行直接访问
与向量的对比:
功能上:和向量没有多少区别,
性能上:在双端队列起点上的插入和删除操作快
顺序容器——列表 (list)
列表主要用于存放双向链表,可以从任意一端开始遍历。列表还提供了拼接(splicing)操作,将一个序列中的元素从插入到另一个序列中
对比:
元素的插入和删除操作对 list 而言尤为高效
与 vector 和 deque 相比,对元素的下标访问操作的低效是不能容忍的,因此 list 不提供这类操作

关联容器
STL标准库中只包含有序关联容器set、multiset、map、multimap
set, multiset:数据项就是索引项。 multiset允许出现重复的索引项。
map, multimap:数据项是由索引项和其他某种类型的数据组成的一对数据。 multimap允许出现重复的索引项。

关联容器——map
增加和删除节点对迭代器的影响很小。对于迭代器来说,可以修改实值,而不能修改key
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次

使用map得包含map类所在的头文件#include
map对象是模板类,需要关键字和存储对象两个模板参数:map<int, string> personnel;//用int作为索引,存储string对象

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key
通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据
从map中删除元素
移除某个map中某个条目用erase()
该成员方法的定义如下
iterator erase(iterator it); //通过一个条目对象删除iterator erase(iterator first, iterator last);//删除一个范围
size_type erase(const Key& key); //通过关键字删除
例如:
enumMap.erase(1); //删掉关键字“1”对应的条目
enumMap.erase(enumMap.begin()); //删掉第一个条目
enumMap.erase(enumMap.begin(), enumMap.begin() + 2); //删掉起始的两个条目
clear()就相当于 enumMap.erase(enumMap.begin(), enumMap.end());
Adapter(适配器) 可改变containers或function object接口的一种组件
Algorithm(算法) 各种基本算法如sort、search…等

terator(迭代器) * 连接containers和algorithms

迭代器是面向对象版本的指针
指针可以指向内存中的一个地址
迭代器可以指向容器中的一个位置
输入迭代器
可以用来从序列中读取数据
输出迭代器
允许向序列中写入数据
前向迭代器
既是输入迭代器又是输出迭代器,并且可以对序列进行单向的遍历
双向迭代器
与前向迭代器相似,但是在两个方向上都可以对数据遍历
随机访问迭代器
也是双向迭代器,但能够在序列中的任意两个位置之间进行跳转
迭代器的使用
list intList;
list::iterator it;

什么时STL
即标准模板库,是一个高效的C++程序库。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值