• 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的更多相关文章

  1. 详细解说 STL 排序(Sort)

    0 前言: STL,为什么你必须掌握 对于程序员来说,数据结构是必修的一门课.从查找到排序,从链表到二叉树,几乎所有的算法和原理都需要理解,理解不了也要死记硬背下来.幸运的是这些理论都已经比较成熟,算 ...

  2. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

  3. STL的std::find和std::find_if

    std::find是用来查找容器元素算法,但是它只能查找容器元素为基本数据类型,如果想要查找类类型,应该使用find_if. 小例子: #include "stdafx.h" #i ...

  4. STL: unordered_map 自定义键值使用

    使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...

  5. C++ STL简述

    前言 最近要找工作,免不得要有一番笔试,今年好像突然就都流行在线笔试了,真是搞的我一塌糊涂.有的公司呢,不支持Python,Java我也不会,C有些数据结构又有些复杂,所以是时候把STL再看一遍了-不 ...

  6. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  7. STL bind1st bind2nd详解

    STL bind1st bind2nd详解   先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...

  8. STL sort 函数实现详解

    作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...

  9. STL的使用

    Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等.而且它在STL中时间效率也很高效:几乎与数组不相上下. #include ...

  10. [C/C++] C/C++延伸学习系列之STL及Boost库概述

    想要彻底搞懂C++是很难的,或许是不太现实的.但是不积硅步,无以至千里,所以抽时间来坚持学习一点,总结一点,多多锻炼几次,相信总有一天我们会变得"了解"C++. 1. C++标准库 ...

随机推荐

  1. 永久使用mybase

    (1)关闭程序 (2)找到程序的安装路径:D:\mybase\mybase\nyfedit7pro (3)打开mybase.ini 文件,7以下版本文件名称为nyfedit.ini

  2. 深入分析Java反射(七)-简述反射调用的底层实现

    前提 Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行 ...

  3. 01 语言基础+高级:1-5 常用API第二部分_day01.【Object类、常用API: Date类、System类、StringBuilder类】

    day01[Object类.常用API] 主要内容 Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 java.lang.O ...

  4. 在CentOS7上从源码编译安装redis,并做成服务程序

    1.安装编译的依赖环境 # 安装pcre开发包: yum install -y pcre-devel # 安装ssl功能需要openssl库 yum -y install openssl-devel ...

  5. 学习数论 HDU 4709

    经过杭师大校赛的打击,明白了数学知识的重要性 开始学习数论,开始找题练手 Herding HDU - 4709 Little John is herding his father's cattles. ...

  6. 画一画BeagleboneBlack的PCB

    一直有听说“Cadence是这个星球上第一好用的EDA软件”,便想着找机会来学学.正好BeagleboneBlack是用Cadence设计的,而且是开源硬件,原理图和PCB文件可以直接在Wiki上下载 ...

  7. 从list中取N个随机生成一个集合

    在工作中发现有很多有序算法,较少见到一些可用的无序随机算法.无序随机算法的目的是让客户感觉每次都不一样,因为一直看一样的会审美疲劳哈. 在jdk自带一种CollectionUtils.shuffle& ...

  8. LGOJ1861 星之器

    前置扯淡 我对这个题目的评价和网上各位大佬的一样:人类智慧题 (显然我不具有人类智慧--) Description link 现在有一个 \(n \times m\) 的矩阵\(A\),里面的每个元素 ...

  9. (一)Thread的run() 和 start() 方法

    Java多线程在实际开发中会遇到很多问题,对于这种争抢CPU时间片段的选手,我们或许有很多困惑,捉摸不透.即便如此,它也是可以被我们控制的. 最近在看Java多线程的书籍,里面有好多我曾经不怎么注意的 ...

  10. 二十二、NFS服务深入讲解

    一.查看nfs服务: [root@nfsserve ~]# ps -ef|grep -E "rpc|nfs"rpc       1565     1  0 17:29 ?      ...