栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

C++ STL详解超全总结(快速入门STL)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ STL详解超全总结(快速入门STL)

C++ STL常用内容总结

下面会介绍很多C++ STL库里面的模板,在编程中STL犹如神器,实用简洁好用。
STL绝对让你受益无穷!


声明:因文章篇幅较大,所以有些内容另加了链接,如要了解,可在相应的目录跳转链接。

本文是我参考相关博客自己总结整理,如有侵权,请联系我删除。


1.vector(数组) 1.1 介绍

vector为可变长数组(动态数组),定义的vector数组可以随时添加数值和删除元素。

头文件

#include < vector >

初始化:

//初始化
//方式一:初始化一维可变长数组
vectornum; //定义了一个名为num的存int数据的一维数组
vectornum;//定义了一个名为num的存double数据的一维数组
vectornum;//node是结构体类型

//方式二:初始化二维可变长数组
vectornum[5];//定义可变长二维数组
//注意:行是不可变的(只有5行),而列可变可以在指定行添加元素
//第一维固定长度为5,第二维长度可以改变

//方式三:初始化二维均可变长数组
vector >num;//定义一个行和列均可变的二维数组

简单访问:

//方式一:单个访问,假设num数组中已经有了5个元素
cout< 

初始化技巧:

//1.附加长度
vectorv(n);//定义一个长度为n的数组,动态定义
//2.附加长度和初始值
vectorv(n,0);//所有的元素均为0
1.2 方法函数

知道了如何定义初始化可变数组,下面就需要知道如何添加,删除,修改数据。

相关方法函数如下:

c指定为数组名称

代码含义
c.front()返回第一个数据
c.pop_back()删除最后一个数据 O(1)
c.push_back(element)在尾部加一个数据 O(1)
c.size()返回实际数据个数(unsigned类型) O(1)
c.clear()清除元素个数 O(N),N为元素个数
c.resize(n,v)改变数组大小为n,n个空间数值赋为v,如果没有默认赋值为0
c.insert(it,x)向任意迭代器it插入一个元素x O(N)
例:c.insert(c.begin()+2,-1)将-1插入c[2]的位置
c.erase(first,last)删除[first,last)的所有元素
c.begin()返回首元素的迭代器(通俗来说就是地址)
c.end()返回最后一个元素后一个位置的迭代器(地址)
c.empty()判断是否为空,为空返回真,反之返回假

注意: end()返回的是最后一个元素的后一个位置的地址,不是最后一个元素的地址,所有容器均是如此

以上 O(n),O(1)说的是时间复杂度

1.3 注意点 1.3.a 排序

使用sort排序要: sort(c.begin(),c.end());

对所有元素进行排序,如果要对指定区间进行排序,可以对sort()里面的参数进行加减改动。

1.3.b 访问

数组访问:

上面有简单的访问演示,下面进行扩充并复习

下标法: 和普通数组一样
注意:一维数组的下标是从0到v.size()-1,访问之外的数可能会出错

迭代器法: 类似指针一样的访问 ,首先需要声明迭代器变量,和声明指针变量一样,可以根据代码进行理解(附有注释)。

代码如下:

vectorvi; //定义一个vi数组
vector::iterator it = vi.begin();//声明一个迭代器指向vi的初始位置

vector数组访问相关代码:

1.3.1.下标访问:

//添加元素
for(int i=0;i<5;i++)
	vi.push_back(i);
	
//下标访问 
for(int i=0;i<5;i++)
	cout< 

1.3.2.迭代器访问:

//迭代器访问
vector::iterator it;   
//相当于声明了一个迭代器类型的变量it
//通俗来说就是声明了一个指针变量

//方式一:
vector::iterator it=vi.begin(); 
for(int i=0;i<5;i++)
	cout<<*(it+i)<<" ";
cout<<"n";

//方式二:
vector::iterator it;
for(it=vi.begin(); it != vi.end();it++)
	cout<<*it<<" ";
//vi.end()指向尾元素地址的下一个地址

1.3.3.智能指针:

只能遍历完数组,如果要指定的内容进行遍历,需要另选方法。
auto 能够自动识别类型。

vectorv;
v.push_back(12);
v.push_back(241);
for( auto i : v) 
	cout< 

综上:

  1. vi[i] 和 *(vi.begin() + i) 等价
  2. 说明:只有vector和string的stl容器支持*(it+i)的元素访问

关于string下面有讲述,可以往后看哦

2.stack(栈) 2.1 介绍

栈为数据结构的一种,是STL中实现的一个先进后出,后进先出的容器。

就像火车进入没有出口的隧道一样,隧道是stack栈容器,火车车厢是入栈元素,火车头先进去,火车尾最后进隧道,当火车倒出来时,火车尾最先出来,火车头最后出来,所有的元素满足先进后出的规则。

//头文件需要添加
#include

//声明
stacksta;
stacksta;
stacksta;//node是结构体类型
2.2 方法函数
代码含义
push()压栈,增加元素 O(1)
pop()移除栈顶元素 O(1)
top()取得栈顶元素(但不删除)O(1)
empty检测栈内是否为空,空为真 O(1)
size()返回stack内元素的个数 O(1)
2.3 注意点 2.3.a.栈遍历

栈只能对栈顶元素进行操作,如果想要进行遍历,只能将栈中元素一个个取出来存在数组中

2.3.b.模拟栈

可以通过一个数组对栈进行模拟,一个存放下标的变量top模拟指向栈顶的指针。

特点: 比stack更快,如果能模拟就模拟,会减少时间。
注:我就做过这样的题,stack超时了,但模拟轻松通过

下面是简单的代码描述:

int sta[100];
int top=0;//初始化top
for(int i=0;i<=5;i++)
{
	//入栈 
	sta[top++]=i;
}
int top_element = sta[--top]; 

//入栈操作示意
//  0  1  2  3  4  5  
//                    top
//出栈后示意
//  0  1  2  3  4 
//                 top

注意: top始终指向栈顶元素的下一个位置(除初始位置外),数组中的元素其实还存在

看完上述代码,我i们可以发现这种方法可以很方便地对栈的元素进行遍历。

如果想要在栈中存放不同的数据类型,可以考虑使用vector数组进行模拟栈。

3.queue(队列) 3.1 介绍

队列是一种先进先出的数据结构。
比喻性的描述可为 一条两端通透的隧道,火车车厢先进就先出,后进就后出。

//头文件
#include
//定义初始化
queueq;
3.2 方法函数
代码含义
front()返回队首元素 O(1)
back()返回队尾元素 O(1)
push()尾部添加一个元素副本 进队O(1)
pop()删除第一个元素 出队 O(1)
size()返回队列中元素个数,返回值类型unsigned int O(1)
empty()判断是否为空,队列为空,返回true O(1)

队列还有另外两种双端队列,优先队列,下面做简单阐述,如果要详细了解大家可以找相关的博客学习,很抱歉不能够提供更多信息。

4.deque(双端队列) 5.priority_queue(优先队列) 6.map(映射) 7.set(集合) 7.1 介绍

set容器中的元素不会重复,当插入集合中已有的元素时,并不会插入进去,而且set容器里的元素自动从小到大排序。

即:set里面的元素不重复 且有序

//头文件
#include
//初始化定义
setse;
7.2 函数方法
代码含义
s.begin()返回set容器的第一个元素
s.end()返回set容器的最后一个元素
s.rbegin()返回逆序迭代器,指向容器元素最后一个位置
s.rend()返回逆序迭代器,指向容器第一个元素前面的位置
s.clear()删除set容器中的所有的元素,返回unsigned int类型O(N)
s.empty()判断set容器是否为空
s.insert()插入一个元素
s.size()返回当前set容器中的元素个数O(1)
erase(iterator)删除定位器iterator指向的值
erase(first,second)删除定位器first和second之间的值
erase(key_value)删除键值key_value的值
查找
s.find(元素)查找set中的某一元素,有则返回该元素对应的迭代器,无则返回结束迭代器
s.lower_bound(k)返回大于等于k的第一个元素的迭代器
s.upper_bound(k)返回大于k的第一个元素的迭代器
7.3 访问

a.迭代器访问

for(set::iterator it=s.begin();it!=s.end();it++)
	cout<<*it<<" ";

b.简便的方法

for(auto i : s)
	cout< 

c.访问最后一个元素

//第一种
cout<<*s.rbegin()< 
 //第二种
set::iterator iter = s.end();
iter--;
cout<<(*iter)< 
//第三种
cout<<*(--s.end())< 
7.4 重载<运算符 
//重载<运算符
struct cmp {
    bool operator () (const int& u, const int& v) const
    {
       // return + 返回条件
    }
};
set se;

7.5 其它的set

multiset:元素可以出现多次,且有序
unordered_set :元素无序且只能出现一次
unordered_multiset : 元素无序可以出现多次

若需了解,读者可自行查阅相关资料。

8.pair 8.1 介绍

pair只含有两个元素,可以看作是只有两个元素的结构体。
应用:

  • 代替二元结构体
  • 作为map键值对进行插入(代码如下)
mapmp;
mp.insert(pair("xingmaqi",1));
//头文件
#include

//1.初始化定义
pairp("wangyaqi",1);//带初始值的
pairp;//不带初始值的

//2.赋值
p = {"wang",18};
8.2 访问
//定义结构体数组
pairp[20];
for(int i=0;i<20;i++)
{
	//和结构体类似,first代表第一个元素,second代表第二个元素
	cout< 
9.string字符串 
10.bitset 

由于作者水平有限,内容纯手敲,整理可能有误。
如果有哪些不足或者错误的地方,也希望大家督促我尽快改正哦,我会及时回复的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/395957.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号