算法竞赛向 C++ Standard Library 使用速查

因网络上 STL 教程大多零散且缺乏严谨性,本文对算法竞赛所需 C++ Standard Library 做了一个较为全面的总结。

全文主要参考以下文档:

  • Containers library - cppreference.com
  • C++ 标准库简介 - OI Wiki

如有能力,阅读原文可获得更深入的了解。

1 STL 算法

均在 #include<algorithm> 定义。

  • std::sort(first,last,cmp)

    排序为不降序列。

    接受随机访问迭代器。可自定义比较函数。

    平均时间复杂度 O(nlogn),C++11 后严格 O(nlogn)

  • std::stable_sort(first,last,cmp)

    排序为不降序列,且保持相等元素的顺序。

  • std::lower_bound(first,last,val,cmp)

    返回指向首个不小于 val 的元素的迭代器,如无,返回 last

    要求小于 val 的值和大于等于 val 的值分居区间两侧。

    可自定义比较函数。若迭代器支持随机访问,对数时间复杂度,否则为线性。

  • std::upper_bound(first,last,val,cmp)

    返回指向首个大于 val 的元素的迭代器,如无,返回 last

  • std::unique(first,last,cmp)

    保留区间中所有连续等值区间的首个元素组成新序列,返回处理后序列的尾迭代器。

    接受前向迭代器,可自定义判断相等的函数。

    线性时间复杂度。

2 基本或特殊容器

注:C++11 新引入的容器,大部分头文件名与容器名一致。

  • pair #include<utility> :元素对。
  • tuple (C++11) :元组。
  • bitset #include<bitset> :定长压缩 01 串,可在 O(NK) 的时空复杂度内完成常见运算,K 对应操作系统位数。
  • string #include<string> :字符串。

2.1 pair

  • operator= :重载了赋值运算符用于拷贝。
  • first / second :访问第一项或第二项。
  • std::make_pair(a,b) :新建元素对,自动检测类型。
  • operator<=> :重载了各种比较运算符,按第一关键字、第二关键字顺序比较。

2.2 tuple

  • operator= :重载了赋值运算符用于拷贝。
  • std::get<i>(tp) :获取元组的第 i 项。
  • std::get<T>(tp) :获取元组中类型为 T 的项。
  • std::make_tuple(a,b,c,...):新建元组,自动检测类型。
  • operator<=> :重载比较运算符,同样是顺序关键字比较。 …

2.3 string

vector 类似。其余重要特性如下:

  • c_str() :生成一个 C 风格字符串(尾部置 0)并返回其头部指针。
  • length()size() 的同义函数。
  • append(str) :后方追加字符串,返回 *this
  • append(first, last) :区间插入版本。
  • operator+ :连接两个字符串。
  • compare(str) :字典序比较。返回一个 int,用 <0 / ==0 / >0 判断该字符串小于 / 等于 / 大于参数字符串。
  • operator<=> :字典序比较的运算符重载。
  • substr(pos=0, count):返回 [pos, min(pos+count, size())) 的子串。时间复杂度与 count 成线性。
  • pop_back() (C++11)
  • find(str) / rfind(str) / find_first_of(c) / find_first_not_of(c) / find_last_of(c) / find_last_not_of(c):找字符串或字符,返回位置。若无,返回 npos=-1无时间复杂度保证,不建议使用。

2.4 bitset

bitset<N> bs(val / str):声明一个长度为 N 的 bitset 并设定初值。

  • & / ! / ^ / ~ / >> / << :支持 AND / OR / XOR / NOT / 右移 / 左移等位运算系列。
  • operator== :判断两个 bitset 是否相同。
  • test(idx) / operator[idx] :前者会做越界检查,抛出异常。
  • size()
  • count() :返回 1 的个数。
  • all() (C++11) :检查是否全为 1。
  • any() / none() :检查是否存在 1 / 没有 1。
  • set() / reset() :所有位赋 1 / 0。
  • flip() :翻转 0 / 1。

3 STL 容器概览

以下部分均为 STL 容器相关内容。

3.1 迭代器

声明:形如 vector<int>::iterator iter = xxx.begin()。C++11 后可用 auto 代替类型声明。

*iter 取值,iter++ 后继。

双向迭代器可 iter--,随机访问迭代器支持加减、比较运算。

  • begin(), end() :返回迭代器。end() 常作为 NULL 使用。
  • cbegin(), cend() (C++11) :部分容器支持,返回只读迭代器。
  • rbegin(), rend() :部分容器支持,返回反向迭代器。
  • crbegin(), crend() :部分容器支持,返回只读反向迭代器。

3.2 公共性质

  • operator= :重载了赋值运算符用于拷贝。
  • empty() :返回容器是否为空,即 v.begin() == v.end()
  • size() :返回容器内元素个数。
  • clear() :清空容器。

4 序列式容器或容器适配器

序列式容器:

  • array (C++11) :定长顺序表,常数随机访问。
  • vector #include<vector>:顺序表,常数后段插入,常数随机访问。
  • deque #include<deque> :顺序表,常数双端插入,常数随机访问
  • list #include<list> :链表,常数插入删除,双向迭代器。
    • forward_list (C++11) :单向版本。

容器适配器(均不支持迭代器):

  • queue #include<queue>:队列(FIFO)。适配双向变长序列式容器,即 deque(默认)或 list
  • stack #include<stack>:栈(LIFO)。适配变长序列式容器,即 deque(默认)、vectorlist
  • priority_queue #include<queue>:大根堆。适配随机访问变长序列式容器,即 vector(默认)或 deque

4.1 vector

Find:

  • crbegin()
  • at(idx) / operator[idx] :前者会做越界检查,抛出异常。
  • front(), back() :返回首尾元素引用。

Modify:

  • push_back(x) / pop_back() :均摊常数复杂度。
  • insert(iter, val) :于迭代器 iter 处插入,返回指向被插入元素的迭代器。 insert(iter, first, last) :左闭右开区间插入,返回指向首个被插入元素的迭代器。 注意,此操作非常数时间复杂度
  • erase(iter) :于迭代器 iter 处删除,返回指向被删除元素的后一个元素的迭代器。 erase(first, last) :左闭右开区间删除,返回指向被删除元素的后一个元素的迭代器。 注意,此操作非常数时间复杂度

Size:

  • resize(n) :改变长度,可指定补充元素默认值。
  • shrink_to_fit() :调整为恰好长度。

vector<bool> 被特殊定义,使用方式较为复杂,不建议使用

4.2 deque

  • push_front(x), pop_front()

其余与 vector 类似。

stack

  • top()
  • push(x)
  • pop()

queue

  • front()
  • push(x)
  • pop()

priority_queue

std::priority_queue<TypeName, Container, Compare>:类型名,底层容器,比较类型。

大根堆,默认用 < 比较大小,即 Compare 传入 std::less<T>。亦可选择传入 std::greater<T> 使用 > 作为比较符号,进而构造出小根堆。

函数同 queue,但 push() / pop() 为对数时间复杂度。

参照 std::less<T> 的实现,自定义比较方式,需传入一个重载了 operator() 的结构体。

4.3 list

  • 无随机访问接口。
  • insert(iter, val) / erase(iter) :插入与删除变为常数时间复杂度,参见 vector
  • sort(cmp) :为链表特殊设计的 O(nlogn) 稳定排序算法。

其余与 deque 类似。

5 关联式容器

不支持随机访问,双向迭代器,大部分操作为对数时间复杂度,红黑树实现。

  • set / multiset #include<set>:元素有序。后者支持同值多元素。
  • map / multimap #include<map>:键有序。后者支持同键值多元素。

5.1 set / multiset

set<Key, Compare>:类似 priority_queue,可自定义比较方式。

Find:

  • crbegin()
  • count(x) :返回值为 x 的元素数量。
  • lower_bound(x) / upper_bound(x) :为 set 特殊定制的对数时间复杂度 lower_boundupper_bound

没有 nth_element(),对数时间复杂度查询第 k 大需手写或使用 pbds 库。

Modify:

  • insert(x) :插入元素 x。返回 pair<iterator, bool>,表示插入元素的迭代器与插入是否成功。 对于 multiset,由于插入不会失败,insert 只返回迭代器。
  • erase(x) :删除所有值为 x 的元素,返回删除元素的个数。 erase(iter) :删除迭代器指向的元素,(C++11) 返回指向被删除元素的后一个元素的迭代器。 erase(first, last):左闭右开区间删除,(C++11) 返回指向被删除元素的后一个元素的迭代器。

删除单个值为 x 的元素,可按如下方法进行:

auto it = s.find(x);
s.erase(it);

5.2 map / multimap

map<Key, T, Compare>:可自定义比较方式。

  • 对迭代器解引用得到 pair<Key, T>
  • insert(pair<Key, T>)
  • at[key] / operator[key]:前者会做越界检查,抛出异常。

其余与 set 类似。

6 无序关联式容器 (C++11)

单向迭代器,平均常数时间复杂度,Hash 实现。

若不支持 c++11,使用时需引入 TR1 扩展。例如,使用 unordered_map 需引入 #include<tr1/unordered_map> 头文件,使用时需写为 std::tr1::unordered_map

  • unordered_set / unordered_multiset #include<unordered_set>:元素无序。
  • unorderep_map / unordered_multimap #include<unordered_map>:键无序。

只有单向迭代器,其余特性与有序版本类似。

此外,可按如下方法自定义相等判定方式和 Hash 函数。

  • unordered_set<Key, Hash, KeyEqual>
  • unordered_map<Key, T, Hash, KeyEqual>

如上,可自定义 Hash 函数。

本文转载于网络 如有侵权请联系删除

相关文章

  • python通过Tkinter显示网络图片

    '''tk_image_view_url_io.py displayanimagefromaURLusingTkinter,PILanddata_stream testedwithPython27andPython33byvegaseat01mar2013 ''' importio allowsforimageformatsotherthangif fromPILimportImage,ImageTk try: #Python2 importTkinterastk fromurllib2importurlopen exceptImportError: #Python3 importtkinterastk fromurllib.requestimporturlopen root=tk.Tk() findyourselfapictureonaninternetwebpageyoulike (rightclickonthepicture,underpropertiescopytheaddress) url="ht

  • 【连载13】详解CNN五大经典模型之一AlexNet

    AlexNet在ILSVRC-2012的比赛中获得top5错误率15.3%的突破(第二名为26.2%),其原理来源于2012年Alex的论文《ImageNetClassificationwithDeepConvolutionalNeuralNetworks》,这篇论文是深度学习火爆发展的一个里程碑和分水岭,加上硬件技术的发展,深度学习还会继续火下去。网络结构分析‍ 由于受限于当时的硬件设备,AlexNet在GPU粒度都做了设计,当时的GTX580只有3G显存,为了能让模型在大量数据上跑起来,作者使用了两个GPU并行,并对网络结构做了切分,如下:·输入层输入为224×224×3的三通道RGB图像,为方便后续计算,实际操作中通过padding做预处理,把图像变成227×227×3。·C1卷积层该层由:卷积操作+MaxPooling+LRN(后面详细介绍它)组成。(1)、卷积层:由96个featuremap组成,每个featuremap由11×11卷积核在stride=4下生成,输出featuremap为55×55×48×2,其中55=(227-11)/4+1,48为分在每个GPU上的fea

  • Python爬虫解析奥斯卡最佳影片《寄生虫》

    在看厌了各种关于武汉疫情的新闻报道和自媒体文章产生之后,今天小编来讲讲文娱方面的大事儿。大洋彼岸的“奥斯卡”电影节上,韩国电影《寄生虫》出人意料的赢得了最佳影片、最佳原创剧本等四大奖项,成为当晚最大的赢家。此外在之前的戛纳电影节上,该影片也拿下了韩国影史上第一个金棕榈奖。为什么这部片子这么好看,口碑如此好呢?今天小编就从数据的角度(数据来源于豆瓣)以及一个非专业的影评人的角度来为大家一一揭晓。爬虫代码该影片在豆瓣上的评分上的评分为8.7分,同时有78万人次看及《爱情公寓5》(评分6.3,17.1万人看过)这种家喻户晓的热门剧,该片的评分以及其他维度的数据,都已经是非常的领先了。寄生虫的豆瓣页面但从评分上来看,大约有90%的人的评分是停留在了5颗星和4颗星,而在一星以及二星的评分的人只有1%,这足以体现了这部电影的口碑以及影响力。可视化代码而从观影人的地域分布来看,观看的人都集中在北上广深一线城市,当然新一线城市例如杭州、成都等观看人数也不少。可以看得出来该剧在大城市还是深受人们喜爱的。观众的城市分布影评影片起始于一个居住在半地下室的四口之家展开:父母二人是无业游民,一双儿女也是失学在家

  • Genymotion Android模拟器Genymotion的安装和使用

    环境:Win7Genymotion2.12.0下载地址:http://download.canadiancontent.netGenymotion.htmlVirtualBox5.1.34下载地址:https://www.virtualbox.org/wiki/Downloadshttps://www.virtualbox.org/wiki/Download_Old_Builds_5_1说明:Genymotion运行依赖virtualBoxGenymotion-ARM-Translation_v1.1下载地址:https://forum.xda-developers.com/attachment.php?s=c9d69f893cf0b11162520337433c222c&attachmentid=2680937&d=1397258016https://pan.baidu.com/s/11doSzCNa88uDRaVOKUR2sg步骤1、安装virtualbox改个安装目录,其它按默认设置,一路next,有弹出提示安装软件则选择安装2、安装Genymotion改个安装目

  • 冲上云霄-云从业人员随笔(2)

    当我想写一篇技术文的时候,发现写出来效果还真真的不错。 ByStatLee在上一篇中,我讲述了运维开发的必经之路,如何构建一个流畅的开发环境,其实有点像搭建了一个钩子,将本地环境的代码勾进了远程开发机中(开发机即代表有中间件/语言解析的环境),那其实解决了代码开发的IDE,还是差点意思,因为需要一个流畅的环境支持快速发布/回滚。 明显普通的VM已不能满足(以往结合SVM或GIT的方式来进行回滚是否太慢了?),所以今天这篇引入了之前笔者构建的Docker环境来加速开发。现在的技术已然不是当年笔者非常苦逼地做Demo环境能比的了,在云时代我们有更多的选择,而笔者作为其中的一员,有义务也有责任为圈子铺路,以下Demo仅仅代表笔者个人,不代表任何厂商言论,若是您觉得使用阿里云或Azure或AWS方便,友商也是有对应的解决方案哈。1、我们登陆下腾讯云官网,随手购买一个TKE(腾讯K8S服务)环境就可以完成笔者以前做了几个月的Docker环境,进入腾讯云容器服务界面:2、费用方面才不到每小时1元,这是一个令人感动的开发成本3、全部搞定后确认信息再创建即可4、这个时候你就会发现一台全新的“类VM”出

  • 一些小算法代码,看各位能否看懂

    importjava.util.Scanner; /** *Createdbyjunyi.pcon2017/1/25. */ publicclassMain{ staticintcount1=0; publicstaticvoidf(doublea[],intn,intcur){ if(cur==9){ if(a[0]+a[1]/a[2]+((a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]))==10){ count1++; System.out.println(a[0]+"+"+a[1]+"/"+a[2]+"+"+a[3]+"*"+a[4]+"*"+a[5]+"/"+a[6]+"*"+a[7]+"*"+a[8]+"n=="+count1); } return; } for(inti=1;i<=n;i++){ booleanok=true; for(in

  • 深度报道:小型装配机器人渐行渐近(中)

    机器人正变得更便宜、更小、更精确且更易使用。可选空间也在扩大:六轴、SCARA、Delta机器人或者新型双臂机器人–各有自己的优势。它们能够看见、感受到、抓取并充满信心地装配小零件。无论是在狭小的空间或洁净室,大的场所或中小型企业,在3C市场、化妆品、能源、汽车或者生命科学领域,正越来越多地使用机器人装配小零件。(相关:深度报道:小型装配机器人渐行渐近(上))生命科学中的机器人装配随着北美机器人市场在2015年的上半年创造了新记录,由自动化集成商们直接看到需求也是意料之中的。“过去10年中,我们已经看到至少有80%的应用都涉及到某种形式的机器人,无论是单个还是多个机器人,”位于加利福尼亚州SimiValley的DynamicAutomation公司的所有人和总裁MarcFreedman说。“而在过去的5年里,增长几乎是指数级的。在生命科学行业我们的主要工作已经完成,剩下的大部分是装配,都是些通常可以拿在手中的组件。” SCARA机器人用于医疗设备的装配和包装,包括玻璃瓶。在维修和清洗过程中,有保护罩保护不锈钢夹具、传感器和线路。DynamicAutomation成立于1986年,是DE

  • Javascript函数的简单学习

    第九课 函数的定义与调用 1:函数的定义    语法格式    function函数名(数据类型参数1){//function是定义函数的关键字       方法体;//statements,用于实现函数功能的语句       [返回值returnexpression]//expression可选参数,用于返回函数值    }命名规则:函数名的命名规则,当一个名字包含多个单词的时候,习惯上用下划线把单词分隔开,如like_this()。另一种习惯是在第一个单词以后的所有单词都以一个大写字母开始,如likeThis()。    //1:函数名:区分大小写,并且在同一个页面中,函数名是唯一的    //2:parameter:可选参数,用于指定参数列表,但使用多个参数时    //,参数间使用逗号进行分割,一个函数最多使用255个参数    实例    vara=10;    varsum=0;    functionadd(a,b){       sum=a+b;       returnsum;    } 2:函数的调用  函数的参数:javascript函数可以以任意的数目的参数

  • 2022-10-15:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。 你可以按 任意顺序 返回答案。

    2022-10-15:给你一个整数数组nums和一个整数k,请你返回其中出现频率前k高的元素。你可以按任意顺序返回答案。要求时间复杂度O(N)。输入:nums=1,1,1,2,2,3,k=2。输出:1,2。答案2022-10-15:力扣347。词频统计,bfprt算法。力扣上测试了主流语言的运行速度和内存占用。运行速度上,rust最快,go最慢,但跟java差不多。内存占用上,rust最少,go比rust稍微多一点,java最多。代码用rust编写。代码如下:userand::Rng; usestd::{collections::HashMap,iter::repeat}; implSolution{ pubfntop_k_frequent(nums:Vec<i32>,k:i32)->Vec<i32>{ letmutmap:HashMap<i32,i32>=HashMap::new(); fornuminnums.iter(){ map.insert( *num, ifmap.contains_key(num){ *map.get(num).u

  • 对java程序员来说时间格式永远让人挠头来看Java Date Time 教程-时间测量

    在Java中,用System.currentTimeMillis()来测量时间最方便。 你要做的是在某些操作之前获取到时间,然后在这些操作之后你想要测量时间,算出时间差。下面是一个例子: longstartTime=System.currentTimeMillis(); callOperationToTime(); longendTime=System.currentTimeMillis(); longtotalTime=endTime-startTime; 复制 现在变量totalTime将包含执行callOperationToTime()方法所需要的全部时间。 反复操作 由于System.currentTimeMillis()没有返回精准的时间,所以不止一次地去执行测量操作是个不错的主意。也许10次、100次或者1000次,甚至更多。这样由于大粒度时间值(该值并不是每毫秒都在变化着)而导致的非精准时间将趋于平稳。 反复执行很多次测量操作的另一个很好的理由是,允许Java虚拟机去装载那些测量操作代码的classes,即时编译它,或许还能对它进行优化。 Timer类 前文所列出的计算方

  • FFmpeg视频编码 YUV420P编码H264

    //第一步:注册组件->编码器、解码器等等…   av_register_all();   //第二步:初始化封装格式上下文->视频编码->处理为视频压缩数据格式   AVFormatContext*avformat_context=avformat_alloc_context();   //注意事项:FFmepg程序推测输出文件类型->视频压缩数据格式类型   constchar*coutFilePath=[outFilePathUTF8String];   //得到视频压缩数据格式类型(h264、h265、mpeg2等等...)   AVOutputFormat*avoutput_format=av_guess_format(NULL,coutFilePath,NULL);   //指定类型   avformat_context->oformat=avoutput_forma

  • iOS修改项目名称

    网上很多方法修改iOS项目名字,但是操作不当就会遇到文件路径错误,修改前项目和修改后的项目路径指向同一文件,在这就是把项目修改完全打不开等等。今天在这分享完美修改项目名称,避免路径错误,文件共用等等重大错误。 下面整理出项目由原工程名(Manager)修改成现工程名(HGZSH)过程,项目修改前架构路径截图       1、在Xcode中修改项目名称(点击Return修改项目名称后回车)           2、关闭项目工程,修改项目文件夹名称(由原工程名“Manager”修改成现工程名“HGZSH”)   3、修改项目文件夹下文件夹名称,(由原工程名“Manager”修改成现工程名“HGZSH”),如下图3处地方:     4、修改项目文件名(右击选择包内容)             5、修改Podfile文件中项目名称         6、打开终端在,切换到当前项目

  • WebAPI2使用Autofac实现IOC属性注入完美解决方案

    一、前言 只要你是.NETer你一定IOC,IOC里面你也会一定知道Autofac,上次说了在MVC5实现属性注入,今天实现在WebApi2实现属性注入,顺便说一下autofac的程序集的注入方式,都会在后面的代码里面有提现 在WebAPI2使用Autofac注入的时候大多数人会出现如下问题: 未能加载文件或程序集“System.Web.Http,Version=5.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自HRESULT:0x80131040) 截图如下: 这个是Autofac强依赖造成的,比较坑的。解决办法如下。 Nuget添加Microsoft.AspNet.WebApi 或通过NuGet程序包管理器控制台添加: Install-Package Microsoft.AspNet.WebApi Update-Package Microsoft.AspNet.WebApi -reinstall(存在) 原因:我们新建

  • 以太坊:解决私链节点连接 No data write error 的问题

    在连接私链的节点的时候,出现了新节点无法同步原有节点的问题。信息大概是这样的: WARN[01-23|11:44:44.057]Nodedatawriteerrorerr="statenode4f42e5…b8507ffailedwithallpeers(1tries,1peers)"   这个问题发生的原因,简单来说,就是原有节点已经事先有过一些挖掘,但是挖掘的数量不多。 当一个新节点试图去连接这个原有的节点,它会尝试去获取head-128号区块,并且尝试去同步。 因为链的长度比较短,所以head-128是个负数,因此这个区块不存在,导致同步失败。 解决方法就是让原有节点继续去挖矿,挖到长度合适的时候就会开始同步了。   参考:https://github.com/ethereum/go-ethereum/pull/20545#issuecomment-584550027

  • webfont应用系列(二)如何制作图标字体?

    工具: AdobeIllustrator CS5 Fontographer 5.1,下载地址 1、打开Fontographer,菜单"File"->"New"新建字体文件,双击第一个带有两个"**"的格子,打开编辑页面。此时为了方便查看,建议通过"Windows"->"Tilevertically"把窗口为横向平铺,如图(右边是编辑页):    图一、Fontographer界面,右侧为字体图形编辑页 把矢量图标复制到编辑页中,调整位置和及大小,主界面可以实时预览图标形状,如图(为了方便截图窗口调成了上下平铺):    图二、复制矢量图形进入编辑页,调整大小及位置,同时主界面中能够实时预览   关闭编辑页,回到主界面,此时一个字体图标做好了。 2、但问题是,如何让1中添加好的图标对应到具体的字符上面呢? 回到主界面,点选刚才编辑的格子,菜单"Element"->"Selectioninfo",在出现的对话框中填写"Glyphname"(字符)及"Unicodeindex"(字符编码),点击"

  • luogu 5556

    luguo5556剑圣护符 1题目描述 2分析 由于点的权值小于\(2^{30}\),所以对于超过30个数字,一定可以存在异或为0的情况。所以对于每个询问,如果x到y之间的节点个数超过30的,答案一定是YES。对于小于等于30个数字,我们可以暴力建立线性基,如果有一个数不能插入线性基,答案也是YES,如果所有的数都能插入线性基,那么答案是NO。 如何修改呢?由于是修改路径,所以我们可以进行树链剖分,问题转换为区间修改,单点查询。这个可以用线段树或者带差分的树状数组来做,我写了一个树状数组。 时间复杂度:\(O(n\log_{2}^{2}{n})\),本题的主要时间复杂度在于树链剖分。 3代码 #include<bits/stdc++.h> usingnamespacestd; intconstN=1e5+10; structedge{ intto,nt; }e[N<<1]; inth[N],cnt,v[N],top[N],son[N],sz[N],n,q,sum,id[N],f[N][17],tin[N],tout[N],tot,d[40],s[N

  • MySQL最基础(三):多表查询、事务管理和部分DCL

    bykonley mysql最基础第三弹(完结篇),主要涉及多表查询、事务管理和部分DCL知识 十、多表查询 10.1笛卡尔积 如果直接这样子查两个表 select*fromemp,dept; 复制 将会产生表1字段数*表2字段数条记录 我们发现不是所有的数据组合都是有用的,只有员工表.dept_id=部门表.id的数据才是有用的。所以需要通过条件过滤掉没用的数据 笛卡尔积 有两个集合AB,取这两个集合的所有组成情况(相乘) 要完成多表查询,首先应该消除笛卡尔积中无用、冗余的数据。 10.2内连接查询 用左边表的记录去匹配右边表的记录,如果符合条件的则显示。如:从表.外键=主表.主键 1.隐式内连接 语法 ...where多表条件 一般为表1.外键=表2.主键 where学生表.选课代码=课程表.课程代码 复制 使用where条件消除无用数据 --查询所有员工信息和对应的部门信息 select*fromemp,deptwhereemp.dept_id=dept.'id'; --查询员工表的名称、性别和部门 select emp.name, emp.gender, de

  • 超奥特曼八兄弟--团队展示

    这个作业属于哪个课程 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10633 团队名称 超奥特曼八兄弟 这个作业的目标 团队展示 正文 如下 其他参考文献 无 一、队名 超奥特曼八兄弟 二、团队项目描述 校园二手市场 三、队员风采 吴彪(队长) 学号:20177607 性格:开朗、温和 擅长的技术:java、html 爱好:弹唱、LOL、音乐 希望的软工角色:后台 宣言:请不要假装很努力,因为结果不会陪你演戏。 李杰 学号:20177623 性格:开朗、活泼 擅长的技术:html 爱好:打羽毛球、听歌 希望的软工角色:前端、需求分析 宣言:一起搞好这个项目。 李莹莹 学号:20177610 性格:内向 擅长的技术:html、css 爱好:打游戏 希望的软工角色:前端、系统分析、美工

  • 警告框

    当你的应用程序需要向用户呈现重要信息,或提示用户重要选择时,可以使用警告框(AlertView)和操作表(ActionSheet)。下图左侧部分是警告框,右侧部分是操作表。   Alert&ActionSheet.png 自iOS8开始,Apple用继承自UIViewController的UIAlertController取代了UIAlertView和UIAlertSheet。 警报控制器(UIAlertController)虽然有警告框和操作表两种形式,但其创建步骤是一样的。如下所示: 创建UIAlertController,指定警报控制器样式。 向警报控制器添加按钮。 显示UIAlertController。 1.创建demo 下面通过demo来学习一下。 打开Xcode,点击File>New>Project…,选择iOS>Application>SingleViewApplication模板,点击Next;在ProductName中填写AlertController,点击Next;选择文件,点击Create创建工程。 打开刚

  • Semantic Logging

    http://blogs.msdn.com/b/agile/archive/2013/02/07/embracing-semantic-logging.aspx 13:TheSemanticLoggingApplicationBlock finalversionis released.GetitviaNuGet. UPDATE2/14/2013:TheSemanticLoggingApplicationBlockCTPisnow available. Intheworldofsoftwareengineering,everysystemneedstolog.Logginghelpstodiagnoseandtroubleshootproblemswithyoursystembothindevelopmentandinproduction.Thisrequiresproper,well-designedinstrumentation.Alltoooften,however,developersinstrumenttheircodetodologging

  • html的meta总结

    html的meta总结 http的meta标签感觉平时开发等都接触不到太多,没什么特殊的感觉但是由于各种契机开始看了一下,感觉发现了一些新大陆。尤其是当网页需要响应式或者勉强支持移动端时,就需要多了解一些了。 看上去是否设置meta对html页面的内容的显示没什么影响。但是,正确的设置meta可以实现的效果有包含但不只包含以下这些: 1.控制页面缓冲 2.自动刷新并指向新的页面 3.SEO搜索引擎优化 4.定义页面使用的语言 5.实现网页转换时的动态效果 6.网页定级评价    meta标签的组成:http-equiv和name。 1、name属性 name属性主要用于描述网页,与之对应的属性值为content,content中的内容主要是便于搜索引擎机器人查找信息和分类信息用的。 meta标签的name属性语法格式是: <metaname="参数"content="具体的参数值">。复制 其中name属性主要有以下几种参数: (1)、Keywords(关键字) keywords用来告诉搜索引擎你网页的关键字是什么 <metaname=

相关推荐

推荐阅读