日常笔记6C++标准模板库(STL)用法介绍实例
一、vector常见用法详解
- vector翻译为向量,但是这里翻译成变长数组的叫法更好理解。
- 如果typename是一个STL容器,定义的时候要记得在>>符号之间加上空格,因为在C++11之前标准的编译器会把他当成位移操作。vector<vector > name;
- vector Arrayname[arrySize]和vector<vector > name不一样,其中定义为数组的即第一个中每个都是一个vector容器,一维长度已经固定为arrySize的大小。
- vector元素访问有两种方式,一种是通过下标,还有一种是通过迭代器,通过下标访问和普通数组是一样的操作,重点是通过迭代器访问,vector::iterator it;可以把迭代器理解成像指针一样的东西,通过*it可以访问vector里面的内容。在C++11中特别是在for循环中可以写成auto it
- v[i]和*(v.begin()+i)是等价的
- 左闭右开记住这个思想
- 迭代器中还实现了两种自加操作:++it和it++(自减同理)迭代器支持it < v.end()因此循环条件一般使用it != v.end()
- 在常用STL容器中,只有vector和string中才允许使用v.begin()+i这种迭代器上加数字的写法。
- 迭代器:vector<typename>::iterator it;
常用函数:
- push_back()就是在vector后添加一个元素,时间复杂度为O(1)
- pop_back()就是在vector末尾删除一个元素,时间复杂度为O(1)
- size()用来获得vector中元素的个数,时间复杂度为O(1),size返回的是unsigned类型,这一点对所有的STL都是一样的。
- clear()用来清空vector中所有的元素
- insert(it, x)用来向vector的任意迭代器it处插入一个元素x,时间复杂度为O(N)
- erase()有两种用法删除单个元素,删除一个区间内的所有元素,时间复杂度均为O(N),erase(it)删除迭代器为it位置处的元素;erase(first, last)例如erase(v.begin(), v.begin()+i),左闭右开。
常见用法:
- 存储数据本身可以作为数组使用
- 用邻接表存储图
二、set的常见用法详解
- set翻译为集合,是一个内部自动有序且不含重复元素的容器。
- set容器的元素只能通过迭代器(iterator)访问。
- set内的元素自动递增排序,且自动去除了重复元素。
- 迭代器:set::iterator it;
常见函数用法:
- insert(x)可以将x插入set容器中,并自动递增排序和去重,时间复杂度O(logN)。
- find(value)返回set中对应值为value的迭代器。时间复杂度同上。
- erase()有两种用法,删除单个元素;删除一个区间的所有元素。删除单个元素有两种方法:(1)st.erase(it),it为所需删除元素的迭代器,时间复杂度为1,结合find()函数使用(2)st.erase(value),value为所需删除元素的值,时间复杂度为O(logN);然后是删除区间元素st.erase(first, last)记住这里都是迭代器。
- size()用来获得set内元素的个数,时间复杂度为1
- clear()用来清空set中的所有元素,时间复杂度为O(N)。
常见用途:
- 主要作用是存储自动去重和升序。
- 如果需要处理不唯一的则需使用multiset,C++11中还加了unorder_set,以散列代替set内部的红黑树,可以实现只去重不排序的需求。
三、string的常见用法详解
- 在C语言中,一般是使用字符串数组来表示字符串的即char str[],但是C++直接引入string数据类型。
- string str;
- string可以如同字符串数组一样通过下标来访问;也可以通过迭代器来访问。
- 如果要读入或输出整个字符串只能够使用cin或cout,如果强行使用printf输出,可以使用c_str()函数将string强制转化为字符串数组,解决这个问题,printf("%s", str.c_str());
- string迭代器不像其他容器那样需要参数,string::iterator it;
- 同vector一样可以进行数字操作迭代器
常见函数:
- 可以直接进行拼接操作 str += str2;
- compare operator ,可以直接进行比较,是按照字典序来的
- length()/size(), length()返回string的长度,时间复杂度为1
- insert()有多种方法,时间复杂度为O(n),(1)insert(pos, string),pos是下标号,string是要插入的str,(2)insert(it, it2, it3),it是原字符要插入的位置,是迭代器,it2,it3是为待插入字符串的首尾迭代器。
- erase(),有两种用法,删除单个元素、删除一个区间内的所有元素,时间复杂度均为O(N),str.erase(it),it为要删除的迭代器,str.erase(first, last),区间迭代器。str.erase(pos, length),删除位置开始处,length接下来需要删除的长度。
- clear(),清空所有元素,时间复杂度为1.
- substr()提取字符串中子串, substr(pos, len)pos为位置,len为长度。
- string::npos是一个常数,其本身值为-1,可以作为find函数失配的返回值。
- find()返回出现的位置,str.find(str2), str.find(str2, pos),pos是指定开始查找位置。
- replace(), str.replace(pos, len, str2),把str从pos号位置开始,长度为len的子串替换为str2.
四、map的常见用法详解
- map翻译为映射,也是常用的STL容器。因为map可以将任何基本类型映射到任何基本类型。
- map<typename1, typename2> mp;如果是字符串映射到整数,必须使用string而不能使用char数组。
- 访问方式,使用下标访问,也就是键值。也可以使用迭代器访问,和其他迭代器访问方式一样。
- map可以使用it->first来访问键值,使用it->second来访问值。
- map会以键值从小到大的顺序自动排序,因为map内部也是使用红黑树实现的。
常见函数:
- find(key)返回键值为key的映射的迭代器
- erase(),也有两种用法,单个和区间,mp.erase(it/key)注意是迭代器或是键值即可,区间都是迭代器。
- size(),用来返回map中的对数。
- clear(),清空所有元素。
常见用途
- 需要建立字符与整数之间的联系
- 判断大整数或其他类型是否存在,当bool类型使用
- 字符串和字符串之间的映射也有可能会遇到。
五、queue的常见用法详解
- queue翻译为队列,在STL中主要实现了一个先进先出的的容器
- queue内元素访问,因为队列本身是一种先进先出的数据结构,因此只能通过front()来访问队首元素,通过back()来访问队尾元素,通过push()来将元素压入队列。
常见函数:
- push(x), 将元素x压入队列,时间复杂度为1.
- front()、back()分别用于访问队首和队尾元素。
- pop(),让队首元素出列。
- empty()检查队列是否为空,如果为空返回true,否则返回false
- size()返回queue内元素的个数
主要用途:
- 当实现广度优先搜索时,可以不用自己动手实现一个队列。
- 在使用front()back()时,必须先使用empty()判断队列是否为空,否则会出现错误。
六、priority_queue的常见用法详解
- priority_queue又称优先队列,由名字可知队首元素是当前队列中优先级最高的那一个,底层使用堆来进行实现。可以在任何时候使用push()加入元素,会自动调整使得队首优先级最高。
- 优先队列元素访问,和队列不一样,没有front()和back()函数,只能通过top()函数来访问队首元素。
常见函数:
- push()
- top()
- pop()
- empty()
- size()
priority_queue内元素优先级设置
- 基本数据类型优先级设置:
priority_queue<int> q;
priority_queue<int, vector<int>, less<int> > q;//记得最后这两个>>是有空格的,以上两种方法等效对于基本数据类型而言,如果想换数据类型,只需把对应位置的换掉即可,这个是默认优先级数字越大越高,如果想要换成数字低优先级高,可以把less<int> 换成greater<int>.
- 结构体的优先级设置,相对而言更为重要
struct fruit{
string name;
int price;
}
//如果希望价格高的优先级高,就需要重载小于号<,如下:
struct fruit{
string name;
int price;
friend bool operator < (fruit f1, fruit f2){
return f1.price < f2.price;//注意这里是小于号<,跟cmp里面的符号设置相反。原因在于优先队列默认就是把优先级高的放在队首,记住和cmp中相反即可。
}
}
//接下来就可以进行设置fruit类型的队列了,其内部就是价格高的为优先级高,如果想要价格低的优先级高,只需把上面return中的<号换成>号
priority_queue<fruit> q;
//也可将结构体中的部分写在外面,如下:
struct cmp{
bool operator () (fruit f1, fruit f2){
return f1.price < f2.price;
}
}
//上面注意我们把friend去掉了,同时把<号改成了()
//使用之前第二种方式来定义:
priority_queue<fruit, vector<fruit>, cmp> q;//把之前的less<>换成了cmp
//最后指出如果结果体或数据较大,建议使用引用来提高效率,在比较类参数上加上const和&
friend bool operator < (const fruit &f1, const fruit &f2){
return f1.price < f2.price;//注意这里是小于号<,跟cmp里面的符号设置相反。原因在于优先队列默认就是把优先级高的放在队首,记住和cmp中相反即可。
}
常见用途
- 可以用于贪心算法,也可以解决Dijkstra算法进行优化
- 同样在使用前需要用empty()进行判断
七、stack的常见用法详解
- stack翻译为栈,是STL中实现后进先出的容器。
- 定义同其他容器一样
- 内部元素访问,只能通过top()来访问栈顶元素。
常见函数
- push()
- top()
- pop()
- empty()
- size()
常见用途:
- 一般来模拟实现一些递归,防止程序对栈内存限制导致程序运行出错。
八、pair的常见用法详解
- pair是一个很实用的东西,当想把两个元素绑在一起作为一个合成元素,又不想定义结构体时,pair可以很合适的作为一个替代品。
- pair应添加头文件<utility>
- pair定义:
pair<typename1, typename2> name;
//定义时初始化
pair<string, int> p("haha", 5);
//如果想定义临时pair,下面两种方法都可以
pair<string, int>("haha", 5);
make_pair("haha", 5);
- 元素访问,如同结构体一样即可p.first,p.second
- 比较操作数,可以直接进行比较,先用first进行比较,如果first相等,那么再使用second进行比较。
- 常见用途:作为map的键值对来进行插入如下:
map<string, int> mp;
mp.insert(make_pair("haha", 5));
九、algorithm头文件下常见函数
- max(x, y) min(x, y) abs(x) abs(x)中的x必须是整数,如果是浮点数请使用math头文件下的fabs(x)
- swap(x,y),用于交换想x,y的值
- reverse(it, it2)可以将数组指针在左闭右开之间的元素或容器迭代器范围内的元素进行反转。
- next_permutation(a, a+3),全排序列,使用do...while()
- fill(),可以把数组或容器中的某一段区间赋值为一个相同的元素,和memset中不同,这里的数字是可以为类型范围类对应的所有值。fill(a, a+5, 233);
- sort(),排序函数
- lower_bound()和upper_bound()详解见这里:https://www.cnblogs.com/tsruixi/p/11858226.html
日常笔记6C++标准模板库(STL)用法介绍实例的更多相关文章
- C++_标准模板库STL概念介绍1-建立感性认知
标准模板库的英文缩写是STL,即Standard Template Library. STL里面有什么呢? 它提供了一组表示容器.迭代器.函数对象和算法的模板. 容器是一个与数组类似的单元,可以存储若 ...
- C++_标准模板库STL概念介绍5-其他库与总结
C++还提供了其他一些类库,这些类库更加专用. 例如,头文件complex为复数提供了类模板complex,包含用于float.long和long double的具体化. 这个类提供了标准的复数运算以 ...
- C++_标准模板库STL概念介绍4-算法
STL包含很多处理容器的非成员函数: sort() copy() find() random_shuffle() set_union() set_intersection() set_differen ...
- C++_标准模板库STL概念介绍3-函数对象
函数对象也叫做函数符(functor). 函数符是可以以函数方式和( )结合使用的任意对象. 包括函数名,指向函数的指针,重载了()运算符的类对象. 可以这样定义一个类: class Linear { ...
- C++_标准模板库STL概念介绍2-泛型编程
有了之前使用STL的经验后,接下来讨论泛型编程及其底层的理念: 首先我们知道STL只是泛型编程的一种: 而面向对象的编程方式关注的是编程的数据方面: 而泛型编程关注的是算法: 但是,他们之间的一个重要 ...
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
随机推荐
- 【LOJ2402】「THUPC 2017」天天爱射击 / Shooting(整体二分)
点此看题面 大致题意: 有\(n\)个区间,每个区间有一个权值,当权值变成\(0\)时消失.每个时刻将覆盖某一位置的所有区间权值减\(1\),求每个时刻有多少个区间在这一刻消失. 前言 整体二分裸题啊 ...
- 向github中已创建好的repository提交文件
git init git remote add origin git@github.com:taishan1994/learn_django.git git pull origin master gi ...
- 【Nginx】Nginx反向代理转发Host设置
#事故现场: 服务器A(Nginx服务器):192.168.2.126 服务器B(Web服务器):192.168.2.221 服务器A反向代理服务器B,A配置了upstream为: http { up ...
- Selenium+java - 通过Robot对象上传文件
思路: 1.将文件路径复制到剪切板 2.用robot对象模拟键盘操作即可 复制文件代码: public void setClipboardData(String data) { StringSelec ...
- python3中的数字类型
今天在学校机房刷python题时发现自己对python中的数字类型不理解,回寝室后百度一下. 现在做一个总结. python中的数字类型有: 整数,布尔值,复数,科学计数法,浮点数 1,整数,大小没有 ...
- Long Jumps CodeForces - 479D
E - Long Jumps CodeForces - 479D Valery is a PE teacher at a school in Berland. Soon the students ar ...
- Installation request for topthink/think-captcha ^3.0 -> satisfiable by topthink/think-captcha[v3.0.0].
ThinkPHP5.1安装图形验证码的时候报错: Problem 1 - Installation request for topthink/think-captcha ^3.0 -> sati ...
- 利用Python突破验证码限制
一.实验说明 本实验将通过一个简单的例子来讲解破解验证码的原理,将学习和实践以下知识点: Python基本知识 PIL模块的使用 二.实验内容 安装 pillow(PIL)库: $ sudo apt- ...
- HTTP 压测工具wrk简介
前段时间项目压测,看到开发命令行下使用这个命令进行压测非常简洁.方便,萌发了学习的兴趣,这里仅做简单介绍. 安装 wrk支持大多数UNIX系统,不支持Windows.需要操作系统支持LuaJIT和Op ...
- Android 安全攻防(一):SEAndroid的编译
转自:http://blog.csdn.net/yiyaaixuexi/article/details/8330645 SEAndroid概述 SEAndroid(Security-Enhance ...