C++ 部分STL
- map
map可以理解为一个数组(但实质上并不是,只是方便理解),我们一般的数组不管定义成什么类型他的下标都是整型(int),map和这些数组的区别是他的下标可以是其他类型,由自己定义。map的创建、插值和访问示例如下:
#include"cstdio"
#include"string"
#include"map"
using namespace std;
//尖括号里两个数据类型,第一个可以理解为数组下标的类型,第二个就是数组的数据类型;
map<string,int>mp;
int main(){
mp["one"]=;
mp["two"]=;
printf("%d\n",mp["one"]+mp["two"]);
//结果显然是3;
printf("%d\n",mp["three"]);
//结果是0;
//由于未插入"three"的值,所以"three"的值默认为0;这里要注意是在查询"three"前发现mp中没有"three"而给"three"插入了0的值
//为什么这么说呢?因为在执行完上面的代码之后,mp里面有三条记录,也就是说"three"对应的是0,而"four"则是不存在
return ;
}
NOTE:map这个“数组”会把记录按照下标排序。比如我先插入了mp["b"];再插入mp["a"],mp["a"]会到mp["b"]的前面去;在下面的遍历代码中可以体现;
map的遍历代码如下:
#include"cstdio"
#include"string"
#include"iostream"
#include"map"
using namespace std;
map<string,int>mp;
int main(){
mp["one"]=;
mp["two"]=;
mp["three"]=;
mp["four"]=;
for(map<string,int>::iterator it=mp.begin();it!=mp.end();it++)
cout<< it->first << ":" << it->second <<" ";
/*
结果是:four:4 one:1 three:3 two:2
由此可以看出不是按输入顺序的
*/
cout<<endl;
//C++11版本之后推出了一种更方便的遍历方式
//map中每一条记录都是一个pair,关于pair在这里不展开,可以去百度
for(auto it:mp)
cout<< it.first << ":" << it.second <<" ";
cout<<endl;
return ;
}
还有一些关于map的方法如下:
#include"cstdio"
#include"string"
#include"map"
using namespace std;
map<string,int>mp;
int main(){
mp["one"]=;
mp["two"]=;
mp["three"]=;
mp["four"]=;
mp.insert(make_pair("one",));
//和mp["one"]=1;的作用差不多,区别在于如果mp中的"one"如果已经有值,mp["one"]=1会覆盖掉原有值,而上面这句会插入失败;
printf("%d\n",mp.size());
//mp.size()返回mp中有几条记录,这里插入了四条,所以返回为4;
mp.erase(mp.begin());
//mp.begin()的作用是返回mp中的第一条记录的迭代器,这里的迭代器类似地址,就像指针;
//mp.erase()的作用是删除括号内的记录;
//mp.erase()还有其他写法如:mp.erase("three");删除"three"这条记录;
//mp.erase(mp.begin(),mp.end());mp.end()返回mp里的最后一条记录的后一个迭代器,mp.erase(mp.begin(),mp.end())相当于从头删到尾,相当于mp.clear();
printf("%d\n",mp.size());
//删掉之后还剩3条记录
mp.clear();
//用于清空mp;
printf("%d\n",mp.size());
//可以验证一下,mp已被清空,所以结果为0;
return ;
}
- set
set是一个集合,和map内部都是用红黑树写的,所以比较像,只是set只有键,没有值。一开始我不太会写set的时候用map来代替,就把map的值的数据类型设置为bool。因为bool只有true和false,可以用true表示已存入这个键,用false表示没有这个键。另外,它不能用下标查找和插入。
#include "cstdio"
#include "set"
using namespace std;
// 定义
set<int> st;
int main() {
// 插入
st.insert();
st.insert();
st.insert();
st.insert();
// 查询是否存在某个键
if (st.count()) {
puts("Yes");
} else {
puts("No");
}
if (st.count()) {
puts("Yes");
} else {
puts("No");
}
if (st.count()) {
puts("Yes");
} else {
puts("No");
}
// 之前往st中插入了3,6,1,没有7;所以结果是Yes Yes No
// st的遍历
for (set<int>::iterator it = st.begin(); it != st.end(); it++) {
// 这里的it是一个类似指针的东西,所以要加星号
printf("%d ", *it);
}
// 和mp差不多,st也可以自动排序,而且没有重复值,那种C++ 11版本的遍历方式也是可以的;
// 关于clear size erase 等方法和map差不多,就不写了
return ;
}
- queue
这个容器只能访问最早放进来的东西,也就是队首,只有将队首删掉才能访问第二个元素,常用于BFS算法;
#include "cstdio"
#include "queue"
using namespace std;
queue<int> q;
int main() {
// 依次放入4,2,6
q.push();
q.push();
q.push();
// front 是访问队首的方法,q.front()返回最早放入的也就是4
printf("%d\n", q.front());
// 这个pop用于删除队首,这个时候2就成了队首
q.pop();
printf("%d\n", q.front());
// 求元素个数,一开始放入三个数,4被删除后还剩两个
printf("%d\n", q.size());
// queue的遍历只能通过循环访问并删除
while (!q.empty()) {
printf("%d\n", q.front());
q.pop();
}
return ;
}
- stack
和queue相似,stack只能访问队尾
#include "cstdio"
#include "stack"
using namespace std;
stack<int> sk;
int main() {
// 依次放入4,2,6
sk.push();
sk.push();
sk.push();
// top 是访问队尾的方法,sk.top()返回最晚放入的也就是6
printf("%d\n", sk.top());
// 这个pop用于删除队尾,这个时候2就成了队尾
sk.pop();
printf("%d\n", sk.top());
// 求元素个数,一开始放入三个数,6被删除后还剩两个
printf("%d\n", sk.size());
// stack的遍历
while (!sk.empty()) {
printf("%d\n", sk.top());
sk.pop();
}
return ;
}
C++ 部分STL的更多相关文章
- 详细解说 STL 排序(Sort)
0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
- STL的std::find和std::find_if
std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...
- STL: unordered_map 自定义键值使用
使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...
- C++ STL简述
前言 最近要找工作,免不得要有一番笔试,今年好像突然就都流行在线笔试了,真是搞的我一塌糊涂.有的公司呢,不支持Python,Java我也不会,C有些数据结构又有些复杂,所以是时候把STL再看一遍了-不 ...
- codevs 1285 二叉查找树STL基本用法
C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...
- STL bind1st bind2nd详解
STL bind1st bind2nd详解 先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...
- STL sort 函数实现详解
作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...
- STL的使用
Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等.而且它在STL中时间效率也很高效:几乎与数组不相上下. #include ...
- [C/C++] C/C++延伸学习系列之STL及Boost库概述
想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...
随机推荐
- HttpClient4.x 上传文件
https://blog.csdn.net/wsdtq123/article/details/78888734
- 浅谈Redis五个对象类型的底层原理
本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html Redis是一种key/value型数据库,其 ...
- 浅谈JVM - 内存结构(二)- 虚拟机栈|凡酷
2.1 定义 Java Virtual Machine Stacks(Java虚拟机栈) Java 虚拟机栈描述的是 Java 方法执行的内存模型,用于存储栈帧,是线程私有的,生命周期随着线程启动而产 ...
- idea使用Maven创建的JavaWeb项目新建文件时没有打包到target目录报错
背景:在使用tomcat发布这个项目时,浏览网页,js没有效果. 问题:发现打包之后没有同步到target里 解决办法:点击最右侧的Maven栏->所建项目->Lifecycle-> ...
- Vus the Cossack and Strings(Codeforces Round #571 (Div. 2))(大佬的位运算实在是太强了!)
C. Vus the Cossack and Strings Vus the Cossack has two binary strings, that is, strings that consist ...
- linux 查看链接库的版本
我们编译可执行文件的时候,会链接各种依赖库, 但是怎么知道依赖库的版本正确呢? 下面有几种办法: ldd 这是比较差的,因为打印结果更与位置相关 dpkg -l | grep libprotobuf ...
- 2×c列联表|多组比例简式|卡方检验|χ2检验与连续型资料假设检验
第四章 χ2检验 χ2检验与连续型资料假设检验的区别? 卡方检验的假设检验是什么? 理论值等于实际值 何条件下卡方检验的需要矫正?如何矫正? 卡方检验的自由度如何计算? Df=k-1而不是n-1 卡方 ...
- mui + H5 调取摄像头和相册 实现图片上传
最近要用MUI做项目,在研究图片上传时 ,遇到了大坑 ,网上搜集各种资料,最终写了一个demo,直接看代码.参考(http://www.cnblogs.com/richerdyoung/p/66123 ...
- rabbitmq文档
https://blog.csdn.net/hellozpc/article/details/81436980
- KMP算法复杂度证明
引言 KMP算法应该是看了一次又一次,比赛的时候字符串不是我负责,所以学到的东西又还给网上的博客了-- 退役后再翻开看,看到模板,心想这不是\(O(n^2)\)的复杂度吗? 有两个循环也不能看做是\( ...