C++ STL各标准容器使用手册

2023-10-27

原文:http://blog.csdn.net/nohackcc/article/details/8900017

1 vector
内部实现: 数组 // 就是没有固定大小的数组,vector直接翻译是向量的意思
支持操作:
begin(), //取首个元素,返回一个iterator
end(), //取末尾(最后一个元素的下一个存储空间的地址)
size(), //就是数组大小的意思
clear(), //清空
empty(), //判断vector是否为空
[]  //很神奇的东东,可以和数组一样操作
//举例: vector a;   //定义了一个vector
//然后我们就可以用a[i]来直接访问a中的第i + 1个元素!和数组的下标一模一样!
push_back(), pop_back() //从末尾插入或弹出
insert() O(N) //插入元素,O(n)的复杂度
erase() O(N)  //删除某个元素,O(n)的复杂度
可以用于数组大小不定且空间紧张的情况


2 deque


类似   //双端队列,两头都支持进出
支持push_front()和pop_front()  
是的精简版:)  //栈,只支持从末尾进出
支持push(), pop(), top()
是的精简版   //单端队列,就是我们平时所说的队列,一头进,另一头出
支持push(), pop(), front(), back()


3  list 
内部实现: 双向链表  //作用和vector差不多,但内部是用链表实现
支持操作:
begin(), end(), size(), clear(), empty()
push_back(), pop_back()  //从末尾插入或删除元素 
push_front(), pop_front() 
insert() O(1)  //链表实现,所以插入和删除的复杂度的O(1)
erase()  O(1)
sort()   O(nlogn)(logn) 找不到返
//不支持[ ]操作!


4 set


内部实现: 红黑树 //Red-Black Tree,一种平衡的二叉排序树
//又是一个Compare函数,类似于qsort函数里的那个Compare函数,作为红黑树在内部实现的比较方式
insert() O(logn)
erase() O(logn)
find() O回a.end()
lower_bound() O(logn) 查找第一个不小于k的元素
upper_bound() O(logn) 查找第一个大于k的元素
equal_range() O(logn) 返回pair


5 multiset 允许重复元素的


 


6 map 内部实现: pair组成的红黑树  //map中文意思:印射!!
//就是很多pair 组成一个红黑树
insert() O(logn)
erase()  O(logn)
find()   O(logn) 找不到返回a.end()
lower_bound() O(logn) 查找第一个不小于k的元素
upper_bound() O(logn) 查找第一个大于k的元素
equal_range() O(logn) 返回pair
[key]运算符 O(logn) *** //这个..太猛了,怎么说呢,数组有一个下标,如a[i],这里i是int型的。数组可以认为是从int印射到另一个类型的印射,而map是一个任意的印射,所以i可以是任何类型的!


7 multimap 允许重复元素, 没有[]运算符




8 priority_queue
内部实现: 堆   //优先队列
支持操作:
push() O(n)
pop()  O(n)
top()  O(1)
See also: push_heap(), pop_heap() … in




9 hash_map
内部实现: Hash表//内部用哈希表实现的map
重载HashFcn和EqualKey
支持操作:
insert(); O(1)
earse();  O(1)
[ ];      O(1)


1.sort()
void sort(RandomAccessIterator first, RandomAccessIterator last); 
void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp); 
区间[first,last)
Quicksort,复杂度O(nlogn)
(n=last-first,平均情况和最坏情况)


用法举例:
1.从小到大排序(int, double, char, string, etc)
const int N = 5;
int main()
{
int a[N] = {4,3,2,6,1};
string str[N] = {“TJU”,”ACM”,”ICPC”,”abc”,”kkkkk”};
sort(a,a+N);
sort(str,str+N);
return 0;
}
2.从大到小排序(需要自己写comp函数)
const int N = 5;
int cmp(int a,int b) {return a > b;}
int main()
{
int a[N] = {4,3,2,6,1};
sort(a,a+N,cmp);
return 0;
}
3. 对结构体排序
struct SS {int first,second;}; 
int cmp(SS a,SS b) {
if (a.first != b.first) return a.first < b.first;
return a.second < b.second;
}


v.s. qsort() in C (平均情况O(nlogn),最坏情况O(n^2))    //qsort中的cmp函数写起来就麻烦多了!
int cmp(const void *a,const void *b) {
if (((SS*)a)->first != ((SS*)b)->first)
  return ((SS*)a)->first – ((SS*)b)->first;
return ((SS*)a)->second – ((SS*)b)->second;
}
qsort(array,n,sizeof(array[0]),cmp);


sort()系列:
stable_sort(first,last,cmp); //稳定排序
partial_sort(first,middle,last,cmp);//部分排序
将前(middle-first)个元素放在[first,middle)中,其余元素位置不定
e.g.
int A[12] = {7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5}; 
partial_sort(A, A + 5, A + 12); 
// 结果是 "1 2 3 4 5 11 12 10 9 8 7 6". 
Detail: Heapsort ,
O((last-first)*log(middle-first))


sort()系列:
partial_sort_copy(first, last, result_first, result_last, cmp);
//输入到另一个容器,不破坏原有序列
bool is_sorted(first, last, cmp);
//判断是否已经有序
nth_element(first, nth, last, cmp);
//使[first,nth)的元素不大于[nth,last), O(N)
e.g. input: 7, 2, 6, 11, 9, 3, 12, 10, 8, 4, 1, 5 
nth_element(A,A+6,A+12);
Output: 5 2 6 1 4 3 7 8 9 10 11 12


2. binary_search()
bool binary_search(ForwardIterator first, ForwardIterator last, const LessThanComparable& value); 
bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, StrictWeakOrdering comp); 
在[first,last)中查找value,如果找到返回Ture,否则返回False
二分检索,复杂度O(log(last-first))
v.s. bsearch() in C


Binary_search()系列
itr upper_bound(first, last, value, cmp);
//itr指向大于value的第一个值(或容器末尾)
itr lower_bound(first, last, value, cmp);
//itr指向不小于valude的第一个值(或容器末尾)
pair equal_range(first, last, value, cmp);
//找出等于value的值的范围 O(2*log(last – first))
int A[N] = {1,2,3,3,3,5,8}
*upper_bound(A,A+N,3) == 5
*lower_bound(A,A+N,3) == 3


make_heap(first,last,cmp) O(n)
push_heap(first,last,cmp)  O(logn)
pop_heap(first,last,cmp)  O(logn)
is_heap(first,last,cmp)  O(n)
e.g:
vector vi;
while (scanf(“%d”,&n) != EOF) {
vi.push_back(n);
push_heap(vi.begin(),vi.end());
}


Others interesting:
next_permutation(first, last, cmp)
prev_permutation(first, last, cmp) 
//both O(N)
min(a,b);
max(a,b);
min_element(first, last, cmp);
max_element(first, last, cmp);


Others interesting:
fill(first, last, value)
reverse(first, last)
rotate(first,middle,last);
itr unique(first, last);
//返回指针指向合并后的末尾处
random_shuffle(first, last, rand)


Some Others:
More container: Rope, Slist, Bitset …
More about iterator
Memory allocation

Function object

http://www.cnblogs.com/Xredman/archive/2009/04/26/1443737.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ STL各标准容器使用手册 的相关文章

  • Pyhon引用Socket和Scapy实现稳定性测试

    前言 在日常测试中 稳定性测试是必不可少的环节 但是难以模拟真实的客户场景是短板 而且稳定性测试开始后 执行数据的收集也是少之又少 所以我们结合ptyhon中的Socket库和Scapy库 来实现稳定性测试 可以做到随机EPS 区间EPS出
  • 2023学习软件测试,如何月薪过万?这几条必须具备

    软件测试 如何月薪过万 这个问题换做前几年的功能测试或许还有点小难 但如今以点点点为主的功能测试 即将被淘汰 适者生存的法则下 自动化测试如雨后春笋登上舞台 同一时间 随着各大互联网公司迅速扩大测试人员的招聘规模 也使得软件测试这个行业 但
  • Jenkins完全配置(基于jenkins镜像进行jar包自动化打镜像自动化推入)(renchar与阿里云进行自动化推送)

    写在前面 使用谷歌浏览器可以进行全文翻译 点击配置文件中的蓝色问号可以解决部分问题 点击新建任务 注意maven和jdk需要配置才能使用 需要构建镜像则需提前下载好插件 选择项目类型 输入自定义的任务名称 请根据以下配置文件进行配置 只需修
  • SpringBoot整合Keycloak实现单点登录

    Keycloak是一个开源的身份和权限访问管理工具 轻松为应用程序和安全服务添加身份验证 无需处理储存用户或者验证用户 其提供用户联合 强健的身份验证 用户管理和细粒度授权等功能 1 搭建Keycloak服务器 本文使用docker com
  • 初级Java程序员如何快速提升自己的能力?

    对于刚刚进入工作岗位的初级程序员来说 不论是进入外包公司 还是互联网公司 都需要一个适应的过程 不少刚走上工作岗位的程序员 就是因为迟迟不能进入工作状态而选择离开 这也是比较常见的事情 导致不能进入工作状态的原因主要有三方面 其一是自身的知
  • python小游戏毕设 走迷宫小游戏设计与实现 (源码)

    文章目录 0 项目简介 1 课题背景 2 实现效果 3 Pygame介绍 4 具体实现 4 1 创建迷宫 4 2 定义角色类 4 3 界面切换 5 最后 0 项目简介 Hi 各位同学好呀 这里是L学长 今天向大家分享一个今年 2022 最新
  • 背景的设置、渐变和雪碧图

    一 背景的设置和和可选值 1 background color 设置背景颜色 2 background image来设置背景图片 语法 background image url 相对路径 可以同时为一个元素指定背景颜色和背景图片 这样背景颜
  • springboot学习笔记(一)

    基础知识点 什么是Spring Spring是一个开源框架 2003年兴起的一个轻量级的java开发框架 Spring是为了解决企业级应用开发的复杂性而创建的 简化开发 Spring是如何简化java开发的 什么是springboot sp
  • Keras模型测试准确率震荡大

    今天在Keras训练了一个模型 发现模型的训练accuracy和测试accuracy的准确率偏差比较大 如下 在问了些大佬后 感谢大佬 我的这个原因很可能是因为过拟合导致的差距比较大 之后在每个层之间都加入了dropout 再重新训练模型得
  • Unity中欧拉角

    什么是欧拉角 没有方向 大小概念 1 使用单个角度来保存方位 2 X与Z沿自身坐标系旋转 Y沿世界坐标旋转 3 API Vector3 eulerAngle this tranform rulerAngles 优点 1 仅使用三个数字表达方
  • 如何备份服务器系统还原,服务器操作系统备份和还原

    服务器操作系统备份和还原 内容精选 换一换 实例支持自动化发放裸金属服务器 远程Console登录 支持租户自主管理裸金属服务器生命周期 查询 启动 关机 重启 删除 导出服务器列表 将租户名下的所有裸金属服务器信息 以CSV文件的形式导出
  • signature=8f638f82cfb5ef3c26e5bb05751ee69d,iSpy/VideoSourceAdvanced.resx at 4eee092db75fe362bcfb7752...

    text microsoft resx 2 0 System Resources ResXResourceReader System Windows Forms Version 4 0 0 0 Culture neutral PublicK
  • STM32微控制器综合实训11 伺服电机控制器设计实验

    实验11 伺服电机控制器设计实验 了解伺服电机的应用领域 掌握伺服电机的速度控制模式 伺服电机的位置控制模式 文章目录 程序设计 伺服电机的速度控制模式代码讲解 main c timer c 伺服电机的位置控制模式代码讲解 main c t
  • 8 Buildroot 根文件系统构建

    一 根文件系统简介 根文件系统一般也叫做 rootfs 这个是属于 Linux 内核的一部分 根文件系统首先是一种文件系统 该文件系统不仅具有普通文件系统的存储数据文件的功能 但是相对于普通的文件系统 它的特殊之处在于 它是内核启动时所挂载
  • oracle函数忽略大小写,Oracle中不区分大小写的主键

    我们的数据的语义不区分大小写 因此我们将oracle会话配置为不区分大小写 alter session set NLS COMP LINGUISTIC alter session set NLS SORT BINARY AI 然后 为了利用
  • vue3中的reactive和ref

    一 关于reactive reactive 接受一个对象类型的值 返回一个对象的代理 reactive的特点 1 仅对对象类型有效 对象 数组和 Map Set 这样的集合类型 而对 string number 和 boolean 这样的
  • 自己动手写一个key value store

    一涉及到persistent 哪怕只是最基本的需求 很多人都会依赖数据库 或是其他现成的库或工具 确实 对于文件 大部分人很少直接打交道 或者只是诸如整体反序列化 序列化 按行读取 append new line等有限的操作 一个persi
  • JAVA 文件的基本操作

    获取指定目录下的所有文件的名字 param path 目标目录路径 public static ArrayList
  • 光谱成像技术用于河北鸭梨的物理损伤检测

    目录 前言 相关工作 相关工作一 相关工作二 本文实验 样本 实验设备 数据处理 面检测方法一 面检测方法二 结论 参考文献 前言 高光谱成像技术可以对大范围的农产品进行识别和检测 已经在工业界得到应用 取代了效率低 精度低 费时费力的人工
  • WebView的一些问题分析

    1 性能问题 打开速度比原生慢 对于一个普通用户来讲 打开一个WebView通常会经理一下几个阶段 发出请求 gt 到达新的页面 页面白屏 gt 页面基本框架出现 但是没有数据 gt 页面处于loading状态 gt 出现数据 如果从程序上

随机推荐

  • ElasticSearch6.x +logstash6.x +MySQL8 MySQL8 数据同步,字母大小写问题

    ElasticSearch6 x logstash6 x同步MySQL8数据的时候 sql里面含有的大写字母 到了ElasticSearch6 x的时候就会变成小写 这是因为在jdbc conf里面没有添加 lowercase column
  • 黑客是这样的炼成的

    黑客的态度 黑客们解决问题 建设事物 信仰自由和双向的帮助 人人为我 我为人人 要想被认为是一名黑客 你的行为必须显示出你已经具备了这种态度 要想做的好象你具备这种态度 你就不得不真的具备这种态度 但是如果你想靠培养黑客态度在黑客文化中得到
  • Qt安卓工程报错:No rule to make target

    Qt编译工程报错 No rule to make target 网上查到的解决方案是这样的 第一种情况 Qt编译工程时候 所有用到的源文件包括头文件和库文件的 总路径长度不能超过190个左右字符 一旦超过 就会提示找不到那个文件 这个可能是
  • 新一代的网络请求库 Httpx

    点击上方 Python学习开发 选择 加为星标 第一时间关注Python技术干货 简介 HTTPX 是最近 GitHub看的到一个比较火的一个项目 根据官网的描述 总结有如下特点 和使用 requests 一样方便 requests 有的它
  • 排序算法(一)冒泡排序,简单选择排序,直接插入排序,希尔排序

    冒泡排序 简单选择排序 直接插入排序是三种复杂度为O n2 的算法 希尔排序在特殊增量序列的时候可以获得复杂度为O n3 2 冒泡排序 1 最简单的排序实现 这里把每个数和这个数之后的每个数比较 大于就交换位置 缺点 多出了很多次没有用的交
  • ros2 bag play

    optional arguments h help show this help message and exit s sqlite3 my read only test plugin my test plugin storage sqli
  • Idea intellij 如何创建多个Maven 模块进行协作?

    第一 根工程 先选择新建一个maven工程 不打勾Create from archetype 直接选择next 填写总的工程名字 这样就可以得到如下的项目 删除src下面的文件 比如现在的项目结构要做成如下形式 LS web admin c
  • 2020年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

    C C 编程 1 8级 全部真题 点这里 第1题 数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放 例如 将数组8 6 5 4 1前3项逆序重放得到5 6 8 4 1 时间限制 1000 内存限制 65536 输入 输入为两行 第一
  • 国产免费虚拟化OVM与 OpenStack对比

    OpenStack作为一款全球化的开源软件 需要丰富而强大的技术团队进行深度开发与维护 OVM作为国产免费的虚拟化软件 有开箱即用的优势 不需要二次投入太多成本 下面对两个产品的深度对比 OVM是开箱即用的一站式解决方案 OpenStack
  • Gitee码云如何邀请合作者加入

    问题 在创建了项目之后 想邀请别人加入 始终找不到邀请的入口 解决方案 1 选中项目 2 点击管理 3 项目成员管理 开发者 添加项目成员 邀请用户 4 会有三种不同的邀请方式 随意邀请了
  • 蓝桥杯乘积尾0(分析)

    1 问题描述 如下的10行数据 每行有10个整数 请你求出它们的乘积的末尾有多少个零 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3
  • Error:java: 错误: 不支持发行版本 5 解决方法(详细)

    使用配置 编译器 idea JDK jdk 13 注意 文章篇幅有点长 若省时间可直接看方法二或者方法三 Error java 错误 不支持发行版本 5 出现原因 本地配置jdk和idea默认的jdk不匹配 方法一 File gt Proj
  • vue脚手架vue-cli的卸载和安装

    若电脑之前已经安装过vue cli了 但是版本过低 比方说当前vue cli的版本为2 9 6 然后我想升级到vue cli的最新版本4 0 5 则需要将旧版本卸载 然后再重新安装 vue cli vue cli vue3 0之前版本使用此
  • PHP对接口执行效率慢的优化

    PHP对接口执行效率慢的优化 造成执行效率低的原因可以由很多方面找原因 从代码层面 代码质量低 执行效率也会有很大影响的 从硬件方面 服务器配置低 服务器配置是基础 这个跑不动肯定慢 从数据量方面 查询数据量过多 sql语句过于繁杂 执行缓
  • 安装yarn

    Install via npm It is recommended to install Yarn through the npm package manager which comes bundled with Node js when
  • c字符串函数sprintf()和snprintf()详解

    sprintf 是个变参函数 定义格式如下 int sprintf char buffer const char format argument 精华显然在于第二个字符串 格式化字符串 1 格式化数字字符串 sprintf最常见的应用之一莫
  • React中如何使用refs

    ref是React中的一种属性 当render函数返回某个组件的实例时 可以给render中的某个虚拟DOM节点添加一个ref属性 如下面的代码所示 html view plain copy print
  • Node学习1

    Node 加载模块 加载内置模块和第三方模块直接require 名字 自定义模块需要加路径 require 加载模块时候会自 动调用被加载模块代码 require永远以module export所指向的对象为准 模块作用域 和函数作用域类似
  • 解决VScode使用git报错:Git: Bad status code: 500

    VS CODE GIT 500 问题处理 pudn com相关错误的处理链接博客 作为记录
  • C++ STL各标准容器使用手册

    原文 http blog csdn net nohackcc article details 8900017 1 vector 内部实现 数组 就是没有固定大小的数组 vector直接翻译是向量的意思 支持操作 begin 取首个元素 返回