C++ STL简介:构建高效程序的基石
0. 引言
在现代软件开发领域,C++语言凭借其强大的性能和灵活性占据着重要地位。而C++标准模板库(Standard Template Library,简称STL)作为C++标准库的核心组件,更是开发者手中不可或缺的利器。它犹如一座知识宝库,通过容器、算法、迭代器、仿函数、适配器和分配器这六大核心组件,运用精妙的模板技术,将代码的通用性与复用性发挥到极致,极大地提升了软件开发效率,优化了软件质量。
从本质上来说,STL的设计理念体现了泛型编程(Generic Programming)的思想,它使得开发者可以编写与具体数据类型无关的代码,从而实现高度的代码复用。这种设计不仅减少了重复劳动,还提高了代码的可维护性和可扩展性。
在此呢咱们只是简单介绍一下,至于理解的咱们要结合具体代码和情况来说明,理论与实践相结合才能更好的学习与理解,欲知具体如何,且听后续分解
1. 容器:数据的智能存储方案
容器是STL中用于存储数据的类模板,它根据不同的数据存储和访问需求,提供了多样化的实现方式。根据存储结构和特性,容器主要分为序列式容器和关联式容器两大类。
1.1 序列式容器
序列式容器以线性顺序存储元素,主要包括vector
、list
和deque
。
vector
(动态数组):作为最常用的序列式容器之一,vector
在内存中采用连续存储的方式,这使得它支持高效的随机访问。通过下标操作,开发者可以快速定位和获取元素,这种特性在需要频繁访问元素的场景中尤为重要。例如,在处理大规模数值计算时,vector
能够快速完成遍历和运算。此外,vector
还具备自动内存管理功能,能够根据数据增长自动调整大小。不过,当vector
容量不足需要扩容时,会经历重新分配内存、复制数据的过程,这在数据量较大时会带来一定的性能开销。
list
(双向链表):list
采用双向链表结构,这种结构使得插入和删除操作非常高效。在链表的任意位置插入或删除元素时,只需修改相关节点的指针,无需像vector
那样移动大量数据。然而,由于链表结构的特性,list
不支持随机访问(如[ ]),访问元素时需要从链表一端开始逐个遍历,这在需要频繁随机访问元素的场景中效率较低。例如,在游戏对象管理系统中,如果需要频繁根据索引查找对象,list
就不是一个理想的选择。
deque
(双端队列):deque
结合了vector
和list
的部分优点,它不仅支持在两端快速插入和删除元素,还能实现随机访问。在处理需要频繁在队列两端进行操作的场景,如任务调度队列时,deque
表现出色。不过,相比vector
,deque
的内存管理更为复杂,随机访问的效率也略低。
1.2 关联式容器
关联式容器基于键值对存储和管理数据,主要包括map
和set
。
map
(映射):map
以键值对的形式存储数据,其内部通常采用红黑树等平衡二叉搜索树实现,这使得通过键查找对应值的操作能够在对数时间复杂度内完成。在实际应用中,当需要快速建立数据映射关系时,map
非常有用。例如,在学生信息管理系统中,可以将学生学号作为键,学生详细信息作为值存储在map
中,方便快速查询。
set
(集合):set
用于存储不重复的元素,同样基于平衡二叉搜索树实现。在插入元素时,set
会自动对元素进行排序,保证集合中的元素始终有序。在需要保证元素唯一性且有序的场景下,set
是理想的选择。例如,在统计文本中不重复单词时,将单词插入set
中,set
会自动去除重复并按序存储。
2. 算法:数据处理的高效工具
有了存储数据的容器后,对数据进行各种处理就成为必然需求。STL提供了丰富的算法模板,涵盖查找、排序、遍历、修改等常见的数据处理操作。这些算法的一大特点是独立于具体的数据结构,通过迭代器与容器进行交互,从而实现了高度的通用性。
以排序算法为例,std::sort
是STL中广泛使用的排序算法,它采用内省排序(Introsort),结合了快速排序、堆排序和插入排序的优点。无论是vector
、deque
等序列式容器,还是存储自定义数据类型的容器,只要定义了合适的比较规则,std::sort
都能高效完成排序任务。例如,在一个存储商品结构体的vector
中,可以定义按照商品价格从低到高的比较规则,std::sort
就能据此进行排序。
除了排序,std::find
用于在容器中查找特定元素,std::for_each
可以对容器中的每个元素执行指定操作。这些算法极大地简化了开发者的工作,避免了重复编写复杂的数据处理逻辑,提高了代码的可维护性和可复用性。
3. 迭代器:容器与算法的桥梁
迭代器是一种特殊的对象,其行为类似于指针,在STL中起着至关重要的作用。它为算法提供了一种统一、标准的访问容器元素的方式,就像一座桥梁,连接起容器和算法。迭代器支持解引用、递增等操作,使得算法能够以相同的逻辑处理不同类型的容器。
不同类型的容器提供了不同类型的迭代器,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器等。每种迭代器都定义了特定的操作集合,以适应不同算法的需求。例如,vector
支持随机访问迭代器,这使得std::sort
等需要频繁随机访问元素的算法能够高效运行;而list
仅支持双向迭代器,虽然不适合某些依赖随机访问的算法,但在插入和删除操作中能够发挥高效性能。
4. 仿函数:灵活的行为定制工具
仿函数(Functors),也称为函数对象,是一种特殊的类或结构体,它重载了函数调用运算符()
。从使用形式上看,仿函数和普通函数类似,但它具有更高的灵活性,可以保存内部状态,并在运行时动态改变行为。在STL中,仿函数常用于为算法提供特定的操作逻辑。
例如,在使用std::sort
进行排序时,默认是升序排列。如果需要降序排列,可以自定义一个仿函数:
struct CompareDescending {bool operator()(const int& a, const int& b) const {return a > b;}
};
然后在调用std::sort
时传入这个仿函数:
std::vector<int> numbers = { 5, 3, 1, 4, 2 };
std::sort(numbers.begin(), numbers.end(), CompareDescending());
这样,std::sort
就会按照降序对vector
中的元素进行排序。仿函数的存在使得STL算法能够适应更多复杂的业务需求,增强了代码的灵活性和扩展性。
5. 适配器:接口的转换器
适配器在STL中扮演着接口转换器的角色,它可以将一个类或对象的接口转换为另一个接口,使其能够与其他组件协同工作。STL中的适配器主要包括容器适配器、迭代器适配器和函数适配器。
容器适配器:以现有容器为基础,改变其接口以满足特定需求。例如,stack
和queue
就是典型的容器适配器,它们默认基于deque
实现,也可以指定其他支持相应操作的容器作为底层容器。stack
提供后进先出(LIFO)的操作接口,queue
提供先进先出(FIFO)的操作接口,通过容器适配器,开发者无需从头实现栈和队列的数据结构,提高了开发效率。
迭代器适配器:可以修改迭代器的行为。例如,std::reverse_iterator
是一种迭代器适配器,它可以将普通迭代器反转,使得算法能够以逆序的方式遍历容器。
函数适配器:用于修改函数或仿函数的接口。例如,std::bind
函数适配器可以将函数或仿函数的某些参数绑定为固定值,生成一个新的可调用对象,增加了函数和算法使用的灵活性。
6. 分配器:内存的管理者
分配器负责STL容器中内存的分配和释放,是容器与底层内存管理机制之间的桥梁。默认情况下,STL容器使用标准的内存分配器,基于operator new
和operator delete
来分配和释放内存。但在某些特殊场景下,开发者可能需要自定义分配器。
例如,在内存资源有限的嵌入式系统中,为了避免频繁的内存碎片,可以自定义一个内存池分配器。这种分配器预先分配一块较大的内存空间作为内存池,容器需要内存时从池中分配,释放时归还到池,而不是直接释放回操作系统。此外,自定义分配器还可以用于实现内存日志记录、性能分析等功能。
7. STL的优势与应用场景 *
C++ STL的优势主要体现在以下几个方面:
- 高度复用:通过模板技术,STL实现了代码的高度复用。开发者无需为不同数据类型重复编写类似的数据结构和算法代码,大大提高了开发效率。
- 性能卓越:STL经过大量严格测试和精心优化,性能表现出色,稳定性高,能够应对各种复杂应用场景。
- 易于使用:STL提供了统一、标准的接口,降低了学习和使用门槛,使得开发者能够快速上手。
在实际开发中,STL的应用场景非常广泛:
- 数据处理:在数据分析、科学计算等领域,
vector
和各种算法可以高效处理大规模数据。 - 游戏开发:
list
和deque
常用于管理游戏对象序列和特效队列,利用其高效的插入删除和随机访问特性。 - 网络编程:在网络服务器开发中,
map
和set
可以用于管理连接信息和资源分配。
C++ STL以其强大的功能、高度的通用性和出色的易用性,成为C++开发者不可或缺的工具。熟练掌握STL的使用,不仅能够提高编程效率,编写出更加简洁、高效、健壮的代码,还能为复杂项目开发提供坚实的技术支持。
看到这里,相信你已经对STL有所了解了,具体一篇两篇说不清道不白,咋能一口吃成个胖子呢你说对吧哈哈哈。
话说大家的五一假期怎么样呢——包过得好啊😎😎😎
给大家放一张自己觉得拍的最绝的夜景~~~咱们下期再见咯
相关文章:
C++ STL简介:构建高效程序的基石
0. 引言 在现代软件开发领域,C语言凭借其强大的性能和灵活性占据着重要地位。而C标准模板库(Standard Template Library,简称STL)作为C标准库的核心组件,更是开发者手中不可或缺的利器。它犹如一座知识宝库࿰…...
大模型(LLMs)RAG 版面分析——文本分块面
大模型(LLMs)RAG 版面分析——文本分块面 一、为什么需要对文本分块? 二、能不能介绍一下常见的文本分块方法? 2.1 一般的文本分块方法 2.2 正则拆分的文本分块方法 2.3 Spacy Text Splitter 方法 2.4 基于 langchain 的 Cha…...
系统思考:核心价值与竞争力
最近,设计师的小伙伴跟我提到,行业内竞争越来越激烈,大家都开始拼命降价。但从系统思考的角度来看,我想说一句话:“人多的地方,不要去。” 为什么这么说?在竞争愈发激烈的环境中,我…...
【RocketMQ Broker 相关源码】- broker 启动源码(2)
文章目录 1. 前言2. 创建 DefaultMessageStore3. DefaultMessageStore#load3.1 CommitLog#load3.2 loadConsumeQueue 加载 ConsumeQueue 文件3.3 创建 StoreCheckpoint3.4 indexService.load 加载 IndexFile 文件3.5 recover 文件恢复3.6 延时消息服务加载 4. registerProcesso…...
mysql中int(1) 和 int(10) 有什么区别?
困惑 最近遇到个问题,有个表的要加个user_id字段,user_id字段可能很大,于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单,于是说:这int(1)怕是不够用吧,接下来是一通解…...
jetson orin nano super AI模型部署之路(八)tensorrt C++ api介绍
我们基于tensorrt-cpp-api这个仓库介绍。这个仓库的代码是一个非常不错的tensorrt的cpp api实现,可基于此开发自己的项目。 我们从src/main.cpp开始按顺序说明。 一、首先是声明我们创建tensorrt model的参数。 // Specify our GPU inference configuration optio…...
渗透测试中扫描成熟CMS目录的意义与技术实践
在渗透测试领域,面对一个成熟且“看似安全”的CMS(如WordPress、Drupal),许多初级测试者常陷入误区:认为核心代码经过严格审计的CMS无需深入排查。然而,目录扫描(Directory Bruteforcing&#x…...
数字信号处理学习笔记--Chapter 1 离散时间信号与系统
1 离散时间信号与系统 包含以下内容: (1)离散时间信号--序列 (2)离散时间系统 (3)常系数线性差分方程 (4)连续时间信号的抽样 2 离散时间信号--序列 为了便于计算机对信号…...
LeetCode 热题 100 994. 腐烂的橘子
LeetCode 热题 100 | 994. 腐烂的橘子 大家好,今天我们来解决一道经典的算法题——腐烂的橘子。这道题在LeetCode上被标记为中等难度,要求我们计算网格中所有新鲜橘子腐烂所需的最小分钟数,或者返回不可能的情况。下面我将详细讲解解题思路&…...
软考-软件设计师中级备考 11、计算机网络
1、计算机网络的分类 按分布范围分类 局域网(LAN):覆盖范围通常在几百米到几千米以内,一般用于连接一个建筑物内或一个园区内的计算机设备,如学校的校园网、企业的办公楼网络等。其特点是传输速率高、延迟低、误码率低…...
NHANES指标推荐:LC9
文章题目:Association between lifes crucial 9 and kidney stones: a population-based study DOI:10.3389/fmed.2025.1558628 中文标题:生命的关键 9 与肾结石之间的关联:一项基于人群的研究 发表杂志:Front Med 影响…...
使用 Azure DevSecOps 和 AIOps 构建可扩展且安全的多区域金融科技 SaaS 平台
引言 金融科技行业有一个显著特点:客户期望能够随时随地即时访问其财务数据,并且对宕机零容忍。即使是短暂的中断也会损害用户的信心和忠诚度。与此同时,对数据泄露的担忧已将安全提升到整个行业的首要地位。 在本文中,我们将探…...
原子单位制换算表
速度 0.12.1880.24.3760.36.5640.48.7520.510.940.613.1280.715.3160.817.5040.919.692121.881.532.82243.762.554.7...
【C++重载操作符与转换】下标操作符
目录 一、下标操作符重载基础 1.1 什么是下标操作符重载 1.2 默认行为与需求 1.3 基本语法 二、下标操作符的核心实现策略 2.1 基础实现:一维数组模拟 2.2 多维数组实现:矩阵类示例 三、下标操作符的高级用法 3.1 自定义索引类型:字…...
文章记单词 | 第62篇(六级)
一,单词释义 noon [nuːn] n. 中午,正午clothes [kləʊz] n. 衣服,衣物reward [rɪˈwɔːd] n. 报酬,奖赏;vt. 奖励,奖赏newly [ˈnjuːli] adv. 最近,新近;以新的方式premier [ˈ…...
《CUDA:解构GPU计算的暴力美学与工程哲学》
《CUDA:解构GPU计算的暴力美学与工程哲学》 CUDA 的诞生,宛如在 GPU 发展史上划下了一道分水岭。它不仅赋予了 GPU 走出图形处理的 “舒适区”,投身通用计算的 “新战场” 的能力,更是一场对计算资源分配与利用逻辑的彻底重构。在这场技术革命中,CUDA 以它犀利的架构设…...
Linux ACPI - ACPI系统描述表架构(2)
ACPI系统描述表架构 1.概要 ACPI defines a hardware register interface that an ACPI-compatible OS uses to control core power management features of a machine, as described in ACPI Hardware Specification ACPI also provides an abstract interface for controlli…...
实时在线状态
以下是一个完整的 OnlineUsers 类实现,包含线程安全的在线用户管理功能: import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors;/*** 在线用户管理器(线程安全)* 功能&#…...
《算法导论(第4版)》阅读笔记:p6-p6
《算法导论(第4版)》学习第 4 天,p6-p6 总结,总计 1 页。 一、技术总结 无。 二、英语总结(生词:1) 1. disposal (1)dispose: dis-(“aprt”) ponere(“to put, place”) vt. dispose literally means “to put apart(to separate sth…...
录播课制作技术指南
1.技术版本选择策略 优先采用长期支持版本作为课程开发基础,此类版本在企业级应用中普及度高且稳定性强。技术选型直接影响课程生命周期,稳定的底层框架可降低后续维护成本,避免因技术迭代导致教学内容快速过时。建议定期查看技术社区官方公告…...
【2025软考高级架构师】——知识脑图总结
摘要 本文是一份关于 2025 年软考高级架构师的知识脑图总结。整体涵盖系统工程与信息系统基础、软件工程、项目管理等众多板块,每个板块又细分诸多知识点,如系统工程部分提及系统工程方法、信息系统生命周期等内容,旨在为备考人员提供系统全…...
Allegro23.1新功能之如何设置高压爬电间距规则操作指导
Allegro23.1新功能之如何设置高压爬电间距规则操作指导 Allegro23.1升级到了23.1之后,新增了一个设置高压爬电间距的规则 如下图,不满足爬电间距要求,以DRC的形式报出来了...
**电商推荐系统设计思路**
互联网大厂Java面试实录:马小帅的生死时速 第一轮提问 面试官(严肃地):马小帅,请你先简单介绍一下你过往的项目经验,特别是你在项目中使用的技术栈。 马小帅(紧张地搓手)ÿ…...
BC19 反向输出一个四位数
题目:BC19 反向输出一个四位数 描述 将一个四位数,反向输出。(有前导零的时候保留前导零) 输入描述: 一行,输入一个整数n(1000 < n < 9999)。 输出描述: 针对每组…...
【前端】【面试】在 Vue-React 的迁移重构工作中,从状态管理角度来看,Vuex 迁移到 Redux 最大的挑战是什么,你是怎么应对的?
在从 Vue(Vuex)迁移到 React(Redux)时,状态管理无疑是重构中最具挑战性的部分之一。两者虽本质上都实现了全局状态集中式管理,但在思想、结构与实现方式上存在显著差异。 Vuex 到 Redux 状态管理迁移的挑战…...
ActiveMQ 与其他 MQ 的对比分析:Kafka/RocketMQ 的选型参考(一)
消息队列简介 在当今的分布式系统架构中,消息队列(Message Queue,MQ)扮演着举足轻重的角色,已然成为构建高可用、高性能系统不可或缺的组件。消息队列本质上是一种异步通信的中间件,它允许不同的应用程序或…...
OPENGLPG第九版学习 -视口变换、裁减、剪切与反馈
文章目录 5.1 观察视图5.1.1 视图模型—相机模型OpenGL的整个处理过程中所用到的坐标系统:视锥体视锥体的剪切 5.1.2 视图模型--正交视图模型 5.2 用户变换5.2.1 矩阵乘法的回顾5.2.2 齐次坐标5.2.3 线性变换与矩阵SRT透视投影正交投影 5.2.4 法线变换逐像素计算法向…...
大连理工大学选修课——图形学:第一章 图形学概述
第一章 图形学概述 计算机图形学及其研究内容 计算机图形学:用数学算法将二维或三维图形转化为计算机显示器的格栅形式的科学。 图形 计算机图形学的研究对象为图形广义来说,能在人的视觉系统形成视觉印象的客观对象都可称为图形。 既包括了各种几何…...
雅思听力--75个重点单词/词组
文章目录 1. in + 一段时间2. struggle with + doing sth.3. due to + n. / doing sth.4. all kinds of + n.5. supply6. get sb. down7. sth. be a hit8. ups and downs1. in + 一段时间 “in ten minutes”表示“10分钟内”,“in + 一段时间”表示“在一段时间之内”。 You…...
dubbo 参数校验-ValidationFilter
org.apache.dubbo.rpc.Filter 核心功能 拦截RPC调用流程 Filter是Dubbo框架中实现拦截逻辑的核心接口,作用于服务消费者和提供者的作业链路,支持在方法调用前后插入自定义逻辑。如参数校验、异常处理、日志记录等。扩展性机制 Dubbo通过SPI扩展机制动态…...
Fine Structure-Aware Sampling(AAAI 2024)论文笔记和启发
文章目录 本文解决的问题本文提出的方法以及启发 本文解决的问题 传统的基于Pifu的人体三维重建一般通过采样来进行学习。一般选择的采样方法是空间采样,具体是在surface的表面随机位移进行样本的生成。这里的采样是同时要在XYZ三个方向上进行。所以这导致了一个问…...
股票单因子的检验方法有哪些?
股票单因子的检验方法主要包括以下四类方法及相关指标: 一、统计指标检验 IC值分析法 定义:IC值(信息系数)衡量因子值与股票未来收益的相关性,包括两种计算方式: Normal IC:基于Pearson相关系数…...
Android第三次面试总结之activity和线程池篇(补充)
一、线程池高频面试题 1. 为什么 Android 中推荐使用线程池而非手动创建线程?(字节跳动 / 腾讯真题) 核心考点:线程池的优势、资源管理、性能优化答案要点: 复用线程:避免重复创建 / 销毁线程的开销&…...
【Trae+LucidCoder】三分钟编写专业Dashboard页面
AI辅助编码作为一项革命性技术,正在改变开发者的工作方式。本文将深入探讨如何利用Trae的AI Coding功能构建专业的Dashboard页面,同时向您推荐一个极具价值的工具——Lucids.top,它能够将页面截图转换为AI IDE的prompt,从而生成精…...
CUDA Toolkit 12.9 与 cuDNN 9.9.0 发布,带来全新特性与优化
NVIDIA 近日发布了 CUDA Toolkit 12.9,为开发者提供了一系列新功能和改进,旨在进一步提升 GPU 加速应用的性能和开发效率。CUDA Toolkit 是创建高性能 GPU 加速应用的关键开发环境,广泛应用于从嵌入式系统到超级计算机的各种计算平台。 新特…...
chrome 浏览器怎么不自动提示是否翻译网站
每次访问外国语网页都会弹出这个对话框,很是麻烦,每次都得手动关闭一下。 不让他弹出来方法: 设置》语言》首选语言》添加语言,搜索英语添加上 如果需要使用翻译,就点击三个点,然后选择翻译...
编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要
2025年4月22日,Embarcadero发布了针对RAD Studio 12.3、Delphi 12.3以及CBuilder 12.3的四月补丁。此更新旨在提升这些产品的质量,特别关注于Delphi编译器、C 64位现代工具链、RAD Studio 64位IDE及其调试器、VCL库和其他RAD Studio特性。强烈建议所有使…...
Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试
始终报错 . 补充链接 tinfo 库时报错软件包 ncurses-devel-5.9-14.20130511.el7_4.x86_64 已安装并且是最新版本 没有可用软件包 tinfo-devel。 无须任何处理 make LDLIBS“-lncurses"报错编译时报错make LDLIBS”-lncurses" ? /opt/rh/devtoolset-11/roo…...
驱动开发硬核特训 · Day 27(上篇):Linux 内核子系统的特性全解析
在过去数日的练习中,我们已经深入了解了字符设备驱动、设备模型与总线驱动模型、regulator 电源子系统、I2C 驱动模型、of_platform_populate 自动注册机制等关键模块。今天进入 Day 27,我们将正式梳理 Linux 内核子系统的核心特性与通用结构,…...
【学习笔记】深度学习:典型应用
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接…...
万字详解ADC药物Payload
抗体药物偶联物(ADC)是一种有前景的癌症治疗方式,能够选择性地将有效载荷(Payload)细胞毒性分子递送至肿瘤,降低副作用的严重程度。通常ADC由3个关键成分组成:抗体,连接子和有效载荷…...
算法笔记.求约数
代码实现: #include<iostream> using namespace std; #include<vector> void check(int x) {vector<int> v;for(int i 1;i< x/i;i){if(x%i 0) {cout << i<<" ";v.push_back(i);}}for(int i v.size()-1;i>0;i--){…...
Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows]
Assetto Corsa 神力科莎 [DLC 解锁] [Steam] [Windows] 需要有游戏正版基础本体,安装路径不能带有中文,或其它非常规拉丁字符; DLC 版本 至最新全部 DLC 后续可能无法及时更新文章,具体最新版本见下载文件说明 DLC 解锁列表&…...
启发式算法-遗传算法
遗传算法是一种受达尔文生物进化论和孟德尔遗传学说启发的启发式优化算法,通过模拟生物进化过程,在复杂搜索空间中寻找最优解或近似最优解。遗传算法的核心是将问题的解编码为染色体,每个染色体代表一个候选解,通过模拟生物进化中…...
生成式AI将重塑的未来工作
在人类文明的长河中,技术革命始终是推动社会进步的核心动力。从蒸汽机的轰鸣到互联网的浪潮,每一次技术跃迁都在重塑着人类的工作方式与生存形态。而今,生成式人工智能(Generative AI)的崛起,正以超越以往任何时代的速度与深度,叩响未来工作范式变革的大门。这场变革并非…...
【操作系统】吸烟者问题
问题描述 吸烟者问题是一个经典的同步问题,涉及三个抽烟者进程和一个供应者进程。每个抽烟者需要三种材料(烟草、纸和胶水)来卷烟,但每个抽烟者只有一种材料。供应者每次提供两种材料,拥有剩下那种材料的抽烟者可以卷烟…...
mysql-内置函数,复合查询和内外连接
一 日期函数 函数名称描述示例current_date()返回当前日期(格式:yyyy-mm-dd)select current_date(); → 2017-11-19current_time()返回当前时间(格式:hh:mm:ss)select current_time(); → 13:51:21current…...
软件架构之旅(6):浅析ATAM 在软件技术架构评估中的应用
文章目录 一、引言1.1 研究背景1.2 研究目的与意义 二、ATAM 的理论基础2.1 ATAM 的定义与核心思想2.2 ATAM 涉及的质量属性2.3 ATAM 与其他架构评估方法的关系 三、ATAM 的评估流程3.1 准备阶段3.2 场景和需求收集阶段3.3 架构描述阶段3.4 评估阶段3.5 结果报告阶段 四、ATAM …...
【SQL触发器、事务、锁的概念和应用】
【SQL触发器、事务、锁的概念和应用】 1.触发器 (一)触发器概述 1.触发器的定义 触发器(Trigger)是一种特殊的存储过程,它与表紧密相连,可以是表定义的一部分。当预定义的事件(如用户修改指定表或者视图中的数据)发生时,触发器会自动执行。 触发器基于一个表创建,…...
5.4学习记录
今天的目标是复习刷过往的提高课的DP题目:重点是数位DP,状态压缩DP,然后去做一些新的DP题目 然后明天的任务就是把DP的题目汇总,复习一些疑难的问题 方格取数: 题目背景 NOIP 2000 提高组 T4 题目描述 设有 NN 的方…...