STL常用对象,不会搞得C++跟没学一样
一、map/multimap
map/multimap映射容器的元素数据是由一个Key和一个Value成的,key与映照value之间具有一一映照的关系。
map/multimap容器的数据结构也采用红黑树来实现的,map插入元素的键值不允许重复,类似multiset,multimap的key可以重复。比较函数只对元素的key进行比较,元素的各项数据只能通过key检索出来。虽然map与set采用的都是红黑树的结构,但跟set的区别主要是set的一个键值和一个映射数据相等,Key=Value。
map<first,second> a;
//map,会按照first(键值)排序(查找也是);
map/multimap用法
头文件
#include< map >
map成员函数
begin() //返回指向 map 头部的迭代器
clear() // 删除所有元素
count() //返回指定元素出现的次数
empty() // 如果 map 为空则返回 true
end() //返回指向 map 末尾的迭代器
erase() // 删除一个元素
find() // 查找一个元素
insert() //插入元素
key_comp() //返回比较元素 key 的函数
lower_bound() //返回键值>=给定元素的第一个位置
max_size() //返回可以容纳的最大元素个数
rbegin() //返回一个指向 map 尾部的逆向迭代器
rend() //返回一个指向 map 头部的逆向迭代器
size() //返回 map 中元素的个数
swap() //交换两个 map
upper_bound() //返回键值>给定元素的第一个位置
value_comp() //返回比较元素 value 的函数
创建map对象
#include<iostream>
#include<map>
using namespace std;
map<int,char>mp;//定义map容器
创建结构体map对象
struct student{
int birth;
string name;
};
int id;
typedef map<int,student> Student;// 这里相当于给map<int,student> 起了个别名Student,后续代码均可以用student代替map<int,student> 使用。
插入结构体对象
接上文代码
Stduent a;
cin>>id>>student.birth>>student.name;
a.insert(make_pair(id,student));
通过map容器使得上述解题方式更简便。
二、栈(stack)
1.定义:
栈是一种只能在某一端插入和删除数据的特殊线性表。他按照先进先出的原则存储数据,先进的数据被压入栈底,最后进入的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后被压入栈的,最先弹出)。因此栈也称先进后出表。
允许进行插入删除操作的一端称为栈顶,另一端称为栈底。栈底固定,栈顶浮动。插入元素称为进栈,删除一个元素称为进栈,栈内元素为零称为空栈。
2.stack成员函数
bool empty ( ) ————>栈为空返回true,否则返回false;
void pop ( ) ————>删除栈顶元素,出栈;
void push(const TYPE&value)————> 插入新元素value,放置在栈顶进栈;TYPE:类型int,char…;
size_type size ( ) ————> 返回堆栈中元素个数;(注意注意!!!!切不可赋值给int ,很容易超过int的范围
TYPE&top()————> 查看当前栈顶元素;
三、向量(vector)
它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
使用vector需要注意以下几点:
1、当vector、string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存。 为了避免这种情况,我们应该想办法改变容器的容量使之尽可能小的符合当前 数据所需(shrink to fit)。
vector<type> vec={1,2,3,4.......................};
vector<type>(v).swap(v);
//此时v的容量已经尽可能的符合其当前包含的元素数量
//对于string则可能像下面这样
string(s).swap(s);// 即执行交换后,临时变量会被销毁,内存得到释放。
(1)头文件
#include<vector>
(2)创建vector对象,vector< int > vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素:
vector.erase(vec.begin()+2);删除第3个元素vector.erase(vec.begin()+i,vec.end()+j);删除区间[i,j);区间从0开始
(8)向量大小:vector.size();
(9)清空:vec.clear();
ps:
resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:买了一个新房子,新房子里可以放3张床reserve(3),这是说房子的容量是最多放3张床,但是屋里并不是有三张床,二resize(3),房里安装了3张床,此时房里的床可以使用了。
reserve为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。
resize调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。
由于vector是顺序容器,在内存中分配了一块连续的存储空间。为了保证动态添加元素的高效率,因此必须预先为vector分配一段空间,这个空间就是capacity。
而容器中元素的个数就是size(),在容器中,capacity总是大于等于 size;
四、队列
queue是队列容器,是一种“先进先出”的容器。
头文件
#include <queue>
queue对象的默认构造形式:queue name; 如:
queue<int> name; //一个存放int的queue容器。queue<float> name; //一个存放float的queue容器。queue<string> name; //一个存放string的queue容器。 //尖括号内还可以设置指针类型或自定义类型。
queue的成员函数
queue.push(elem); //往队尾添加元素queue.pop(); //从队头移除第一个元素queue(const queue &que); //拷贝构造函数queue& operator=(const queue &que); //重载等号操作符queue.back(); //返回最后一个元素queue.front(); //返回第一个元素queue.empty(); //判断队列是否为空queue.size(); //返回队列的大小
五、set集合
set/multiset 与map类的区别是set 的key=value。其余跟map类的可以类比。set容器因为key等于value所以按照值排序,由小到大。
set的各成员函数列表如下:
set.begin()--返回指向第一个元素的迭代器set.clear()--清除所有元素
set.count()--返回某个值元素的个数
set.empty()--如果集合为空,返回true
set.end()--返回指向最后一个元素的迭代器
set.equal_range()--返回集合中与给定值相等的上下限的两个迭代器
set.erase()--删除集合中的元素
set.find()--返回一个指向被查找到元素的迭代器
set.get_allocator()--返回集合的分配器
set.insert()--在集合中插入元素
set.lower_bound()--返回指向大于(或等于)某值的第一个元素的迭代器
set.key_comp()--返回一个用于元素间值比较的函数
set.max_size()--返回集合能容纳的元素的最大限值
set.rbegin()--返回指向集合中最后一个元素的反向迭代器
set.rend()--返回指向集合中第一个元素的反向迭代器
set.size()--集合中元素的数目
set.swap()--交换两个集合变量
set.upper_bound()--返回大于某个值元素的迭代器
set.value_comp()--返回一个用于比较元素间的值的函数
set由大到小排序set<int,greater < int > > M;
七、迭代器
vector< int >::iterator name
容器类型< type> ::iterator name
是一类类似指针的,与指针的区别,map set成员的迭代器不能加减一个整数,只能自增或自减运算。但是vector的可以。
双向迭代器(map multimap set multiset)
组合正向迭代器和逆向迭代器的功能,支持多遍算法
随机访问迭代器(vector deque)
组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素。即可以加减一个常数。
小白创作,还亲各位大佬指点,万分感谢!
STL常用对象,不会搞得C++跟没学一样相关推荐
- C++ STL常用标准库容器入门(vector,map,set,string,list...)
STL常用标准库容器 C++ STL中最基本以及最常用的类或容器无非就是以下几个: 目录 string vector deque list forward_list queue priority_qu ...
- C++ STL 常用遍历算法
C++ STL 常用遍历算法 STL的容器算法迭代器的设计理念 1) STL的容器通过类模板技术,实现数据类型和容器模型的分离 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供 ...
- C++STL常用遍历算法
C++STL常用遍历算法 概述 学习目标 算法简介 for_each 功能描述 函数原型 示例 总结 transform 功能描述 函数原型 示例 总结 概述 算法主要是由头文件<algorit ...
- C++超详细STL常用算法总结
STL 常用算法: 写在开篇:整理了一些stl中很常用的算法,涉及到比较,交换,查找,遍历,复制,修改等.值得大嘎收藏呀!! 目录: STL 常用算法: 1. 常用遍历算法: 1.1 for_each ...
- 黑马C++笔记——STL常用算法
STL常用算法 1.概述 STL算法主要是由头文件algorithm functional numeric组成 algorithm 是所有STL文件中最大的一个,涉及到比较.交换.查找.遍历.复制.修 ...
- 【C++提高编程笔记】三.(一).STL常用容器之string容器
文章目录 1.string基本概念 2.string构造函数 3.string赋值操作 4.string字符串拼接 5.string查找和替换 6.string字符串比较 7.string字符存取 8 ...
- 熬夜爆肝!C++核心STL常用算法汇总整理【2W字干货预警 建议收藏】
前言 1 STL- 常用算法 1.1 常用遍历算法 1.1.1 for_each 1.1.2 transform 1.2 常用查找算法 1.2.1 find 1.2.2 find_if 1.2.3 a ...
- 16 STL - 常用容器
本篇博客是根据黑马程序员视频整理,仅供学习使用. 如果这篇文章对你有帮助的话,请不要吝啬一键三连. 16 STL - 常用容器 16.1 string容器 16.1.1 string基本概念 本质: ...
- DOM_05之DOM、BOM常用对象
1.HTML DOM常用对象之Table:①创建:createTHead():createTBody():createTFoot():②删除:deleteTHead():deleteTFoot():③ ...
最新文章
- win10分辨率不能调整_图文介绍win10系统使用hdmi连接电视的处理方法
- Category中实现了原始类实例变量的get方法导致的警告
- 国际10-20标准电极位置
- python编程 入门到实践-终于懂了python编程从入门到实践
- Python2和Python3除法差别
- 如何获取元素与当前可视区域顶部的距离
- linux 命令tar,Linux下tar命令详解
- 重学java基础第十二课:计算机语言发展史
- 图机器学习有多大神力?一文带你回顾2020,展望2021
- Android studio快捷键大全 和 eclipse对照(原)
- OSChina 周三乱弹 —— 万众期待的拉黑功能
- 电脑各类快捷键及运行命令大全
- Linux C 基于epoll的多人聊天室
- Python+Django+vue的旅游信息网站系统项目源码介绍
- JS_综合,全面性增删改查,多条件查询,排序,点击发货
- 三顾茅庐:从刘备面试孔明得出的选股经验
- python中怎么统计英文字符的个数_【Python练习1】统计一串字符中英文字母、空格、数字和其他字符的个数...
- 微信小程序在开发工具上可以编译显示,但是手机预览请求不到数据
- React+阿里云Aliplayer播放器实现rtmp直播(推流时间差,重启播放器,计时观看)
- html计时器重置的代码,javascript 秒表计时器实现代码
热门文章
- linux怎么取消raid磁盘阵列,Linux下彻底关闭某个RAID磁盘阵列
- 操作系统难点解析之进程和线程
- Python爬虫实战之(五)| 模拟登录wechat 1
- 1603 限高二叉排列树(计数DP)
- [六省联考2017]组合数问题
- 微信企业号开发之正式版的本地调试
- 成立仅8个月的个人网站,月收入几十万美金
- 输出目录文件被多个中间文件输出目录相同的工程包含
- ubuntu下安装mysql 杂记
- first() mysql_EF6配合MySQL或MSSQL(CodeFirst模式)配置指引