【ACM学习】【STL】容器的基本功能与分类
admin
2024-01-17 17:28:23
0

14天阅读挑战赛

文章目录

  • 前言
  • STL指南
  • STL容器的基本功能与分类
    • 基本功能
      • 1. `S s1`
      • 2. `s1 op s2`
      • 3. `s1.begin()`
      • 4. `s1.end()`
      • 5. `s1.clear()`
      • 6. `s1.empty()`
      • 7. `s1.size()`
      • 8. `s1.swap(s2)`
      • 9. `s1.rbegin()`
      • 10. `s1.rend()`
    • STL容器分类

前言

本文的所有语句都经本人验证,均正确使用。
由于本文涉及内容比较多,为了尽可能的讲详细些,会把各种例子附上,所以代码样例会比较多,也为了更好的布局,本系列将分开讲解,并且前期为了更加贴合实战需求,暂时只对一些常用的STL容器和基本功能进行讲解,后期有时间会一一补上。

本文STL系列知识参考《C++语言程序涉及(第5版)》

STL指南

  • 容器的基本功能与分类
  • 顺序容器
    • 顺序容器的基本功能
    • 5种顺序容器的特性
      • 向量
      • 双端队列
      • 列表
      • 单向链表和数组
    • 顺序容器的插入迭代器
    • 顺序容器的适配器
  • 关联容器
    • 关联容器的分类及基本功能
    • 集合
    • 映射
    • 多重集合与多重映射
    • 无序容器

STL容器的基本功能与分类

STL有13种基本容器(
顺序容器:vector,deque,list,forward_list,array
关联容器:set,multiset,map,multimap,unorder_map,unorder_set,unorder_multimap,unorder_multiset
),每种都不一样,这里先从共性着手。

以下的功能对于13种STL容器都适用

基本功能

S为一种容器,s1s2是S类型的实例

1. S s1

默认构造一个没有如何元素的空容器

2. s1 op s2

op可以是==,!=,<,>,<=,>=之一,对两个容器之间元素按字典序比较

int main() {int n;cin>>n;vectorvec1;for(int i=1;i<=n;i++){vec1.push_back(i);}copy(vec1.begin(),vec1.end(),ostream_iterator(cout," "));cout<vec2;for(int i=2;i<=n+1;i++){vec2.push_back(i);}copy(vec2.begin(),vec2.end(),ostream_iterator(cout," "));cout<

终端:

4
1 2 3 4 
2 3 4 5 
1

vec1

3. s1.begin()

返回指向s1第一个元素的迭代器

4. s1.end()

返回指向s1最后一个元素的下一个元素位置的迭代器

使用方法:

S::iterator it1=s1.begin();
S::iterator it2=s1.end();
int main() {int n;cin>>n;vectorvec1;for(int i=1;i<=n;i++){vec1.push_back(i);}copy(vec1.begin(),vec1.end(),ostream_iterator(cout," "));cout<::iterator it=vec1.begin();cout<<*it<::iterator it2=vec1.end();cout<<*(it2-1)<

终端:

4
1 2 3 4 
1
2
1
4

可以看到,it迭代器可以自增或自减,并且可以通过*(it+n)来指定后面第n个位置的元素

5. s1.clear()

将s1内容清空

6. s1.empty()

返回布尔值,判断s1是否为空

7. s1.size()

返回s1的元素个数

8. s1.swap(s2)

将s1容器和s2容器的内容交换

int main() {int n;cin>>n;vectorvec1;for(int i=1;i<=n;i++){vec1.push_back(i);}copy(vec1.begin(),vec1.end(),ostream_iterator(cout," "));cout<vec2;for(int i=2;i<=n+1;i++){vec2.push_back(i);}copy(vec2.begin(),vec2.end(),ostream_iterator(cout," "));cout<(cout," "));cout<(cout," "));cout<

终端:

4
1 2 3 4 
2 3 4 5
2 3 4 5
1 2 3 4

可以看到,s1.swap(s2)使两者的内容都发生了交换,而不仅仅是s1

事实上,上述提到的13种容器大部分都是可逆容器(除了少数如slist(单向链表)仅提供前向迭代器的容器),它所提供的迭代器是双向迭代器,可以对容器元素进行双向遍历,在后文将会一一列出STL的容器类别。

故逆向迭代器的函数:

9. s1.rbegin()

得到指向容器最后一个元素的逆向迭代器

10. s1.rend()

得到指向容器第一元素的前一个位置的逆向迭代器

使用方法:

S::reverse_iterator it1=s1.rbegin();
S::reverse_iterator it2=s1.rend();
int main() {vectorvec1;for(int i=1;i<=4;i++){vec1.push_back(i);}copy(vec1.begin(),vec1.end(),ostream_iterator(cout," "));cout<::iterator it=vec1.begin();vector::iterator it2=vec1.end();vector::reverse_iterator it3=vec1.rbegin();vector::reverse_iterator it4=vec1.rend();cout<<*(it3)<

终端:

1 2 3 4 
4
3
1
2

s1.rbegin()指向最后一个元素+n表示向第一个元素方向移动n个单位元素
s1.rend()指向第一元素之前的一个元素,-n表示向最后元素方向移动n个单位
为了方便理解,我们将元素顺序从左到右表示正方向,s1.begin()++和s1.end()++表示向右移动,s1.begin()–和s1.end()–表示向左移动,而s1.rbegin()和s1.rend()正好相反,当然了这里的s1.begin(),s1.end(),s1.rbegin(),s1.rend()都是一个常迭代器,并不可以改变,上述表示只是为了方便理解。
准确地说,iterator的实例it可以使用it++,it+n(n是一个常数),而s.begin/end/rbegin/rend则不可以改变,但是可以通过+n来指向第n个位置元素
下面用一个例子说明:

int main() {listl(4,2);vectorvec1={1,2,3,4};copy(vec1.begin(),vec1.end(),ostream_iterator(cout," "));cout<::iterator it=vec1.begin();cout<<*(it+2)<
1 2 3 4 
3
3

这里有一点是与下一篇博客讲到的初始化顺序容器对象矛盾的,需要特别注意。

输出容器的内容,以空格为分隔符
正向输出:

copy(vec.begin(),vec.end(),ostream_iterator(cout," "));

逆向输出:

copy(vec.rbegin(),vec.rend(),ostream_iterator(cout," "));

迭代器的等价关系:
base()会返回构造该逆向迭代器的那个迭代器

s1.rbegin()==S::reverse_iterator(s1.end())
s1.rbegin().base()==s1.end()
s1.rend()==S::reverse_iterator(s1.begin())
s1.rend().base()==s1.begin()

随机访问容器所提供的迭代器是随机访问迭代器,支持对容器元素的随机访问。

  1. s1[n] 获取容器的第n个元素,等价于s1.begin()[n]

int main() {vectorvec1;for(int i=1;i<=4;i++){vec1.push_back(i);}copy(vec1.begin(),vec1.end(),ostream_iterator(cout," "));cout<

输出:

1 2 3 4 
3
4
4
1

[]里面可以是负数,正负号表示移动方向,该用法对于begin,end,rbegin,rend都适用,且要注意这四种迭代器所指位置与方向的区别

STL容器分类

容器名名称头文件概念
vector向量随机访问容器、顺序容器
deque双端队列随机访问容器、顺序容器
array数组随机访问容器、顺序容器
forward_list单向链表单向访问容器,顺序容器
list列表可逆容器、顺序容器
set集合可逆容器、关联容器
multiset多重集合可逆容器、关联容器
map映射可逆容器、关联容器
multimap多重映射可逆容器、关联容器
unordered_set无序集合可逆容器、关联容器
unordered_multiset无序多重集合可逆容器、关联容器
unordered_map无序映射可逆容器、关联容器
unordered_multimap无序多重映射可逆容器、关联容器

相关内容

热门资讯

车厘子自由的背后,关系到每个人... 来源:磐石之心 “今年实现了车厘子自由,比往年便宜了一半还多。”许多吃货发出感慨。 在电商平台、超...
ETF复盘资讯|沪指止步17连... A股三大指数今日(1月13日)集体回调,截至收盘,沪指跌0.64%,终结17连阳,深证成指跌1.37...
智谱与MiniMax上市:AI... 曾经“百模齐放”的狂热竞争逐渐落幕,行业告别“参数竞赛”的草莽时代,进入了“商业闭环”的验证期。 撰...
容百科技签下1200亿元巨单;... 今日焦点容百科技:与宁德时代签署超1200亿元磷酸铁锂正极材料采购合作协议 容百科技公告称,公司与...
小市值+高研发+低位滞涨的活跃... 科技股的弹性依然为投资者所看重。 近期A股市场表现强势,上证指数、创业板指等均再度创出阶段新高。华福...
每月自我检查乳腺结节,这几个步... 太原龙城中医医院科普,乳腺健康对女性至关重要,而乳腺结节是很多女性可能会遇到的问题。定期进行自我乳腺...
深圳这场盛会,TCL李东生、小... 深圳商报·读创客户端首席记者 刘琼 实习生杨与萌 1月12日,第九届深商盛典暨中国企业家俱乐部20年...
原创 人... 人到70岁,如果你依然活得不够清醒,不知道什么该做什么不该做,那么你的寿命很难再有质的提高,你的生活...
深圳商业秘密刑事律师服务实力榜... 在商业竞争日益激烈的背景下,企业商业秘密保护已成为关乎生存与发展的核心命题。据统计,我国每年因商业秘...
小鹏汽车在长春成立销售服务公司... 天眼查工商信息显示,近日,长春小鹏汽车销售服务有限公司成立,法定代表人为陈志远,注册资本500万人民...
商务部:对原产于美国和韩国的进... 商务部公告2026年第3号 公布对原产于美国和韩国的进口太阳能级多晶硅所适用反倾销措施的期终复审裁定...
“A系列”指数回调,关注A50... 截至收盘,中证A500指数下跌0.8%,中证A100指数下跌0.6%,中证A50指数下跌0.4%。 ...
港股上市!国改发展基金基石投资... 1月12日,宁波通商基金通过市国资国企改革发展基金之甬欣基金参与基石投资的豪威集成电路(集团)股份有...
穆迪:未来五年数据中心投资或达... 据彭博社等外媒报道,国际三大信用评级机构之一穆迪近日发布报告称,未来五年内,全球至少将有3万亿美元资...
人民币现金收付新规来了 注意! 2026年2月1日起 人民币现金收付新规正式实施 遇拒收现金可维权 日前,中国人民银行会同...
海底捞CEO换人 1月13日,海底捞国际控股有限公司(以下简称“海底捞”)在港交所发布公告,宣布该公司董事会主席及执行...
估值腰斩、家族掌舵、三次递表,... 近日,中式快餐品牌“老乡鸡”的控股公司——于开曼群岛注册的LXJ International Hol...
数字人短视频怎么做?一文搞懂 随着AI技术普及,数字人短视频已成内容创作新风口。不少创作者和企业想借此降本增效,却受困于核心准备、...
盼盼食品董事长蔡金垵入选“20... 瑞财经 1月13日,由瑞财经推出的“2025年度食品行业十大杰出人物”榜单揭晓,盼盼食品董事长蔡金垵...
威海营商行丨出口“秒通关”,海... 1月8日,在威海青正蓝海食品有限公司生产车间,经过清洗、调味、包装、冷冻等加工工序,一批近20吨的调...