当前位置: 首页 > news >正文

【C++进阶】深入STL之 栈与队列:数据结构探索之旅

📝个人主页🌹:Eternity._
⏩收录专栏⏪:C++ “ 登神长阶 ”
🤡往期回顾🤡:模拟实现list与迭代器
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

❀stack和queue

  • 📕1. stack和queue的基本概念
    • 🎩stack的基本概念
    • 🎈queue的基本概念
  • 📙2. stack与queue的常用操作
    • ⛰️stack的常用操作
    • 🌄queue的常用操作
  • 📚3. 容器适配器
  • 📒4. deque的简单介绍
    • 💧deque的原理介绍
    • 🌊deque的缺陷
  • 📜5. stack和queue的模拟实现
    • 🍂stack的模拟实现
    • 🍁queue的模拟实现
  • 📖6. priority_queue
    • 🌞priority_queue的基本概念
    • 🌙priority_queue的常用操作
    • ⭐priority_queue的模拟实现
  • 🔥7. 总结


前言: 在编程的世界里,数据结构是构建高效、可靠程序的基础。它们就像是我们编程工具箱中的精密工具,帮助我们解决各种复杂的问题。而在C++的STL中,栈(Stack)和队列(Queue)是两种非常重要的数据结构,它们以不同的方式管理和操作数据,为我们的程序提供了极大的灵活性

为了真正掌握它们,我们需要深入学习它们在STL中的实现方式,理解它们背后的原理和机制,以及学习如何在实际编程中有效地使用它们,让我们一起踏上学习STL栈与队列的旅程吧!


📕1. stack和queue的基本概念

🎩stack的基本概念

栈(Stack)是一种后进先出(LIFO)的数据结构

  • 它的操作特性使其在处理递归调用、函数调用栈以及撤销操作等问题时表现出色。通过栈,我们可以轻松地实现如括号匹配、表达式求值等算法。

在这里插入图片描述
在这里插入图片描述


🎈queue的基本概念

队列(Queue)则是一种先进先出(FIFO)的数据结构

  • 它在处理需要按顺序处理的任务时非常有用。无论是操作系统中的任务调度,还是网络中的数据包传输,队列都扮演着不可或缺的角色。

在这里插入图片描述
在这里插入图片描述


📙2. stack与queue的常用操作

⛰️stack的常用操作

函数说明接口说明
stack()构造空的栈
empty()检测stack是否为空
size()返回stack中元素的个数
top()返回栈顶元素
push()将元素val压入stack中
pop()将stack中尾部的元素弹出
void test_stack()
{stack<int, vector<int>> st; // 构造栈st.push(1); // 将元素val压入stack中st.push(2);st.push(3);st.push(4);printf("栈中有效元素个数为:%d", st.size()); // 返回stack中元素的个数while (!st.empty()) // 检测stack是否为空{printf("%d ", st.top()); // 返回栈顶元素的引用st.pop(); // 将stack中尾部的元素弹出}
}

相较于之前的栈的常用函数学习还是很简单的,在了解完基本用法后,这里推荐几个相关题目


🌄queue的常用操作

函数声明接口说明
queue()构造空的队列
empty()检测队列是否为空,是返回true,否则返回false
size()返回队列中有效元素的个数
front()返回队头元素
back()返回队尾元素
push()在队尾将元素val入队列
pop()将队头元素出队列
void test_queue()
{queue<int, list<int>> q; // 构造队列q.push(1); // 在队尾将元素val入队列q.push(2);q.push(3);q.push(4);printf("队列中有效元素个数为:%d", q.size()); // 返回stack中元素的个数while (!q.empty()) // 检测queue是否为空{printf("%d ", q.front()); // 返回队头元素q.pop(); // 将队头元素出队列}
}

相较于之前的栈的常用函数学习还是很简单的,在了解完基本用法后,这里推荐几个相关题目,不多说直接上题目巩固
最小栈
栈的压入、弹出序列
逆波兰表达式求值
用栈实现队列
用队列实现栈


📚3. 容器适配器

容器适配器是一种机制,它接受一种已有的容器类型,通过封装和改造,使其行为看起来像另一种类型。这允许我们使用特定的数据访问和操作模式(如栈、队列或优先队列)来管理容器中的数据,而无需修改原始容器的实现。

C++标准库定义了三种序列容器适配器:

容器适配器概念
stack(栈)栈是一种后进先出(LIFO)的数据结构,具有push(压栈)、pop(弹栈)、top(查看栈顶元素)等基本操作。在STL中,stack可以建立在vector、list、deque等容器之上。
queue(队列)队列是一种先进先出(FIFO)的数据结构,具有push(入队)、pop(出队)、front(查看队首元素)、back(查看队尾元素)等基本操作。queue在STL中也是一个容器适配器。
priority_queue(优先队列)优先队列是一种特殊的队列,其中元素的出队顺序不是按照它们进入队列的顺序,而是根据它们的优先级。priority_queue提供了push(插入元素)、pop(删除最高优先级元素)、top(查看最高优先级元素)等操作。

虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器, 这是因为stack和队列只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque,这个在stack和queue的基本概念中可以看到。
在这里插入图片描述
在这里插入图片描述

有了容器适配器后,我们在模拟实现时,就不需要自己再从底层出发,而是可以直接调用已经存在的容器


📒4. deque的简单介绍

💧deque的原理介绍

deque(双端队列):是一种双开口的"连续"空间的数据结构

  • 双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高

在这里插入图片描述
在这里插入图片描述

注意:deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组

在这里插入图片描述

我们查表发现deque基本上包含了vector与list的用法,那我们之前为什么还要费尽心思去学习呢?直接学习deque不好吗?


🌊deque的缺陷

与vector比较

  • deque的优势是:头部插入和删除时,不需要搬移元素,效率特别高,而且在扩容时,也不需要搬移大量的元素,因此其效率是必vector高的。

与list比较

  • 其底层是连续空间,空间利用率比较高,不需要存储额外字段。但是,deque有一个致命缺陷:不适合遍历,因为在遍历时,deque的迭代器要频繁的去检测其是否移动到某段小空间的边界,导致效率低下,

在序列式场景中,可能需要经常遍历,因此在实际中,需要线性结构时,大多数情况下优先考虑vector和list,deque的应用并不多,而目前能看到的一个应用就是,STL用其作为stack和queue的底层数据结构

因此我们还是要单独学习list和vector的


📜5. stack和queue的模拟实现

在模拟实现这俩个容器的时候,我们只要实现它的常用函数,在模拟实现时,我们只需要复用就可以了

🍂stack的模拟实现

template<class T, class Container = deque<T>>
class stack
{
public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_back();}const T& top(){return _con.back();}bool empty(){return _con.empty();}size_t size(){_con.size();}
private:Container _con;
};

🍁queue的模拟实现

template<class T, class Container = deque<T>>
class queue
{
public:void push(const T& x){_con.push_back(x);}void pop(){_con.pop_front();}bool empty(){return _con.empty();}const T& front(){return _con.front();}size_t size(){_con.size();}
private:Container _con;
};

关于stack与queue的模拟实现就是复用之前学过的函数,没什么好说的,让我们进入重头戏


📖6. priority_queue

🌞priority_queue的基本概念

关于优先级队列,我们就可以把它想象成堆那样的结构
在这里插入图片描述

优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成
堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue

注意:默认情况下priority_queue是大堆


🌙priority_queue的常用操作

函数声明接口说明
priority_queue()/priority_queue(first,last)构造一个空的优先级队列
empty( )检测优先级队列是否为空,是返回true,否则返回false
top( )返回优先级队列中最大(最小元素),即堆顶元素
push(x)在优先级队列中插入元素x
pop()删除优先级队列中最大(最小)元素,即堆顶元素
void test_priority_queue()
{std::priority_queue<int> q; // 构造优先级队列q.push(1); // 在优先级队列中插入元素xq.push(43);q.push(233);q.push(43);q.push(4);q.push(73);q.push(2);while (!q.empty()) // 检测优先级队列是否为空{printf("%d ", q.top()); // 返回堆顶元素q.pop(); // 删除堆顶元素}
}

⭐priority_queue的模拟实现

// 仿函数,数据的比较方法
template<class T>
class Less
{
public:bool operator()(const T& x, const T& y){return x < y;}
};
template<class T>
class Greater
{
public:bool operator()(const T& x, const T& y){return x > y;}
};
template<class T, class Container = vector<T>, class Compare = Less<T>>
class priority_queue
{
public:priority_queue() // 无参构造{}template<class InputIterator>priority_queue(InputIterator first, InputIterator last) // 迭代器构造:_con(first,last){// 向下调整建堆for (int i = (_con.size() - 2) / 2; i >= 0; i--){AdjustDown(i);}}void AdjustUp(int child) // 向上调整{int parent = (child - 1) / 2;Compare com;while (child > 0){if (com(_con[child], _con[parent])){swap(_con[child], _con[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}}void AdjustDown(int parent) // 向下调整{int child = parent * 2 + 1;Compare com;while (com(child , _con.size())){if ((child + 1 < _con.size()) &&com(_con[child + 1], _con[child])){child++;}if (com(_con[child] , _con[parent])){swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void push(const T& x){_con.push_back(x);AdjustUp(_con.size() - 1); // 在插入新元素时,我们要调整容器里面的元素}size_t size(){return _con.size();}const T& top(){return _con[0];}void pop(){swap(_con[0], _con[_con.size() - 1]);_con.pop_back(); AdjustDown(0); // 删除时,依旧要调整元素}bool empty(){return _con.empty();}
private:Container _con;
};

关于priority_queue的模拟实现,依然是以复用为主,只不过多了一些堆要使用的调整函数,而且我们在查priority_queue这个容器时,不难发现其实它是有三个模板参数的,它的第三个模板参数就是,数据的排列方式,也就是决定大小堆的,这就涉及到了仿函数,关于仿函数,下节我们在讲!


🔥7. 总结

在深入探讨了STL(Standard Template Library)中的栈(stack)与队列(queue)之后,我们不难发现这两大数据结构在程序设计中扮演着至关重要的角色。栈与队列的引入,不仅极大地丰富了C++程序员的工具箱,也为解决各种实际问题提供了更为高效、优雅的方法

学习栈与队列并不仅仅是为了掌握它们的基本操作和应用场景。更重要的是,我们要学会如何根据问题的特点选择合适的数据结构,以及如何有效地利用数据结构来解决实际问题。在这个过程中,我们需要不断思考、探索和实践,才能不断提升自己的编程能力和问题解决能力。让我们继续前行,不断探索编程的奥秘,享受编程的乐趣!

在这里插入图片描述

谢谢大家支持本篇到这里就结束了,端午安康,祝大家天天开心!
在这里插入图片描述

相关文章:

【C++进阶】深入STL之 栈与队列:数据结构探索之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现list与迭代器 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀stack和queue &#x1f4…...

SpringBoot发邮件服务如何配置?怎么使用?

SpringBoot发邮件需要的参数&#xff1f;邮件发送性能如何优化&#xff1f; 在SpringBoot项目中配置发邮件服务是一个常见的需求&#xff0c;它允许我们通过应用程序发送通知、验证邮件或其他类型的邮件。AokSend将详细介绍如何在SpringBoot中配置发邮件服务。 SpringBoot发邮…...

AutoCAD Mechanical机械版专业的计算机辅助设计软件安装包下载安装!

AutoCAD机械版作为一款专业的计算机辅助设计软件&#xff0c;不仅具备卓越的二维绘图功能&#xff0c;更是拥有令人瞩目的3D建模工具&#xff0c;为机械设计师们提供了前所未有的创作空间。 在AutoCAD机械版的3D建模环境中&#xff0c;用户可以借助一系列简洁明了的命令&#…...

json.load报错AttributeError: ‘str‘ object has no attribute ‘load‘

with open(json_file, r) as f:data json.load(f)要写个简单的数据处理脚本&#xff0c;报错AttributeError: ‘str’ object has no attribute ‘load’&#xff0c;查看了一下&#xff0c;路径正确&#xff0c;查了半天博客&#xff0c;不知道错在哪里。 回头一看 jsons_pa…...

单词记忆(第二周)

transplant: trans - plant 移植 perceive: per - ceive 察觉 paraphrase: para - ph - rase 释义 prospect&#xff1a; pro - s - pect 前景 access: ac - cess 进入&#xff0c;通道,访问 generous; gene - rous 慷慨的&#xff0c;丰富的 lecture: lec - ture 讲座 …...

RAG:如何从0到1搭建一个RAG应用

通过本文你可以了解到&#xff1a; 什么是RAG&#xff1f;如何搭建一个RAG应用&#xff1f;目前开源的RAG应用有哪些&#xff1f; 大模型学习参考&#xff1a; 1.大模型学习资料整理&#xff1a;大模型学习资料整理&#xff1a;如何从0到1学习大模型&#xff0c;搭建个人或企业…...

leetcode:67二进制求和

题目链接&#xff1a;67. 二进制求和 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string addBinary(string a, string b) {int stralen a.size(), strblen b.size();int curtc;int Maxlen max(stralen, strblen);vector<int> stra;vector<i…...

大模型日报2024-06-10

大模型日报 2024-06-10 大模型资讯 无需矩阵乘法的语言模型在亿参数规模上表现优异 摘要: 研究表明&#xff0c;无需矩阵乘法的语言模型在亿参数规模上仍能保持顶级性能。这一发现挑战了传统神经网络依赖矩阵乘法的观点&#xff0c;展示了在GPU优化之外的新可能性。 博弈论助力…...

【博士每天一篇文献-综述】Modularity in Deep Learning A Survey

阅读时间&#xff1a;2023-12-8 1 介绍 年份&#xff1a;2023 作者&#xff1a;孙浩哲&#xff0c;布朗克斯医疗卫生系统 会议&#xff1a; Science and Information Conference 引用量&#xff1a;4 论文主要探讨了深度学习中的模块化&#xff08;modularity&#xff09;概念…...

Sentinel不使用控制台基于注解限流,热点参数限流

目录 一、maven依赖 二、控制台 三、基于注解限流 四、热点参数限流 五、使用JMeter验证 一、maven依赖 需要注意&#xff0c;使用的版本需要和你的SpringBoot版本匹配&#xff01;&#xff01; Spring-Cloud直接添加如下依赖即可&#xff0c;baba已经帮你指定好版本了。…...

HTML做成一个端午节炫酷页面

做成端午节页面之前&#xff0c;先了解一下端午节的由来&#xff1a; 1.起源与历史&#xff1a; 端午节起源于中国&#xff0c;始于春秋战国时期&#xff0c;至今已有2000多年历史。 最初是古代百越地区&#xff08;长江中下游及以南一带&#xff09;崇拜龙图腾的部族举行图…...

解决Ubuntu系统/usr/lib/xorg/Xorg占用显卡内存问题原创

在Ubuntu系统中&#xff0c;/usr/lib/xorg/Xorg进程占用显卡内存的问题可能会影响系统性能&#xff0c;特别是在使用GPU进行计算任务时。以下是一些解决方法&#xff0c;可以帮助你减少或解决这个问题&#xff1a; 1. 更新显卡驱动 首先&#xff0c;确保你使用的是最新版本的…...

【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现(附源码)(下篇)

作者&#xff1a;后端小肥肠 上篇&#xff1a;【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现&#xff08;上篇&#xff09;_spring security activiti7-CSDN博客 目录 1.前言 2. 核心代码 2.1. 流程定义模型管理 2.1.1. 新增流程定义模型数据 …...

解密Spring Boot:深入理解条件装配与条件注解

文章目录 一、条件装配概述1.1 条件装配的基本原理1.2 条件装配的作用 二、常用注解2.1 ConditionalOnClass2.2 ConditionalOnBean2.3 ConditionalOnProperty2.4 ConditionalOnExpression2.5 ConditionalOnMissingBean 三、条件装配的实现原理四、实际案例 一、条件装配概述 1…...

【数据结构与算法】使用数组实现栈:原理、步骤与应用

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 &#x1f384;栈&#xff08;Stack&#xff09;是什么&#xff1f; &#x1…...

cell的复用机制和自定义cell

cell的复用机制和自定义cell UITableView 在学习cell之前&#xff0c;我们需要先了解UITableView。UITableView继承于UIScrollView&#xff0c;拥有两个两个相关协议 UITableViewDelegate和UITableViewDataSource&#xff0c;前者用于显示单元格&#xff0c;设置行高以及对单…...

Redis 双写一致原理篇

前言 我们都知道,redis一般的作用是顶在mysql前面做一个"带刀侍卫"的角色,可以缓解mysql的服务压力,但是我们如何保证数据库的数据和redis缓存中的数据的双写一致呢,我们这里先说一遍流程,然后以流程为切入点来谈谈redis和mysql的双写一致性是如何保证的吧 流程 首先…...

《软件定义安全》之四:什么是软件定义安全

第4章 什么是软件定义安全 1.软件定义安全的含义 1.1 软件定义安全的提出 虚拟化、云计算、软件定义架构的出现&#xff0c;对安全体系提出了新的挑战。如果要跟上网络演进的步伐和业务快速创新的速度&#xff0c;安全体系应该朝以下方向演变。 &#x1d7ed; 安全机制软件…...

将AIRNet集成到yolov8中,实现端到端训练与推理

AIRNet是一个图像修复网络,支持对图像进行去雾、去雨、去噪声的修复。其基于对比的退化编码器(CBDE),将各种退化类型统一到同一嵌入空间;然后,基于退化引导恢复网络(DGRN)将嵌入空间修复为目标图像。可以将AIRNet的输出与yolov8进行端到端集成,实现部署上的简化。 本博…...

hcache缓存查看工具

1、hcache概述 hcache是基于pcstat的&#xff0c;pcstat可以查看某个文件是否被缓存和根据进程pid来查看都缓存了哪些文件。hcache在其基础上增加了查看整个操作系统Cache和根据使用Cache大小排序的特性。官网:https://github.com/silenceshell/hcache 2、hcache安装 2.1下载…...

Java 数据类型 -- Java 语言的 8 种基本数据类型、字符串与数组

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 004 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…...

kafka-生产者事务-数据传递语义事务介绍事务消息发送(SpringBoot整合Kafka)

文章目录 1、kafka数据传递语义2、kafka生产者事务3、事务消息发送3.1、application.yml配置3.2、创建生产者监听器3.3、创建生产者拦截器3.4、发送消息测试3.5、使用Java代码创建主题分区副本3.6、屏蔽 kafka debug 日志 logback.xml3.7、引入spring-kafka依赖3.8、控制台日志…...

免费!GPT-4o发布,实时语音视频丝滑交互

We’re announcing GPT-4o, our new flagship model that can reason across audio, vision, and text in real time. 5月14日凌晨&#xff0c;OpenAI召开了春季发布会&#xff0c;发布会上公布了新一代旗舰型生成式人工智能大模型【GPT-4o】&#xff0c;并表示该模型对所有免费…...

DevOps的原理及应用详解(四)

本系列文章简介: 在当今快速变化的商业环境中,企业对于软件交付的速度、质量和安全性要求日益提高。传统的软件开发和运维模式已经难以满足这些需求,因此,DevOps(Development和Operations的组合)应运而生,成为了解决这些问题的有效方法。 DevOps是一种强调软件开发人员(…...

关于选择,关于处事

一个人选择应该选择的是勇敢&#xff0c;选择不应该选择的是无奈。放弃&#xff0c;不该放弃的是懦夫&#xff0c;不放弃应该放弃的是睿智。所以&#xff0c;碰到事的时候要先静&#xff0c;先不管什么事&#xff0c;先静下来&#xff0c;先淡定&#xff0c;先从容。在生活里要…...

大话设计模式解读02-策略模式

本篇文章&#xff0c;来解读《大话设计模式》的第2章——策略模式。并通过Qt和C代码实现实例代码的功能。 1 策略模式 策略模式作为一种软件设计模式&#xff0c;指对象有某个行为&#xff0c;但是在不同的场景中&#xff0c;该行为有不同的实现算法。 策略模式的特点&#…...

展会邀请 | 龙智即将亮相2024上海国际嵌入式展,带来安全合规、单一可信数据源、可追溯、高效协同的嵌入式开发解决方案

2024年6月12日至14日&#xff0c;备受全球嵌入式系统产业和社群瞩目的2024上海国际嵌入式展&#xff08;embedded world china 2024&#xff09;即将盛大开幕&#xff0c;龙智将携行业领先的嵌入式开发解决方案亮相 640展位 。 此次参展&#xff0c;龙智将全面展示专为嵌入式行…...

codeforce round951 div2

A guess the maximum 问题&#xff1a; 翻译一下就是求所有相邻元素中max - 1的最小值 代码&#xff1a; #include <iostream> #include <algorithm>using namespace std;const int N 5e4;int a[N]; int n;void solve() {cin >> n;int ans 0x3f3f3f3f;…...

arcgis开发记录

目录 文章目录 [toc]**arcgis JavaScript API安装**1. arcgisAPI下载地址&#xff1a;https://developers.arcgis.com/downloads/2. 4.4版本API&#xff1a;本地配置3. 3.18版本修改方法 **angular2中加载arcgis JS API**** arcgis加载图层 并显示图层上点的信息****使用图层上…...

RPA-UiBot6.0数据整理机器人—杂乱数据秒变报表

前言 友友们是否常常因为杂乱的数据而烦恼?数据分类、排序、筛选这些繁琐的任务是否占据了友友们的大部分时间?这篇博客将为友友们带来一个新的解决方案,让我们共同学习如何运用RPA数据整理机器人,实现杂乱数据的快速整理,为你的工作减负增效! 在这里,友友们将了…...

百度搜索推广流程/上海好的seo公司

用 pcap_next_ex() 函数代替 _5_ 中的 pcap_loop()函数&#xff1b; pcap_loop()函数是基于回调的原理来进行数据捕获&#xff0c;这是一种精妙的方法&#xff0c;并且在某些场合中&#xff0c;它是一种很好的选择。 然而&#xff0c;处理回调有时候并不实用 -- 它会增加程序的…...

购物网站的建设与维护/西安网站建设平台

Docker 基本用法 1. 安装社区版docker-ce 及 nvidia-docker2 插件 通过官网介绍的软件源的方式安装. 如果要安装nvidia-docker,由于其需要与docker-ce的版本匹配,所以如果是手动下载安装的话需要注意版本号. nvidia-docker对宿主机的要求是安装了nvidia驱动程序和docker程序,而…...

网站怎样和首页做链接地址/初学者做电商怎么入手

opencv相机读取的基本操作 快速入门 cap获取、writer获取、frame获取、frame写入、释放cap和writer import cv2 videoCapturecv2.VideoCapture(path)#读取本地视频 rtsp地址&#xff08;例海康&#xff09; addressrtsp://admin:账号地址:端口号/Streaming/tracks/摄像头号码…...

天津外贸网站建设公司/徐州seo建站

对象数组去重 用ES6的reduce方法 this.backTag [{id:111,name:哈哈哈1}, {id:222,name:哈哈哈2},{id:333,name:哈哈哈3},{id:444,name:哈哈哈4},{id:111,name:哈哈哈5}]; let obj {}this.backTag this.backTag.reduce(function(item, next) {obj[next.id] ? : obj[next.…...

dede网站百度统计怎么做/市场营销策划方案范文

什么是L1正则化 在机器学习任务中&#xff0c;对于一个参数模型&#xff0c;优化参数时一定伴随着损失函数的建立与优化。 通常不加入L1正则化的损失函数为 JL1(w)L(w)J_{L1}(w) L(w) JL1​(w)L(w) 加入L1正则化的损失函数为 JL1(w)L(w)λ∣w∣J_{L1}(w) L(w) \lambda|w| …...

吉林省建设标准化网站/排名首页服务热线

本文实例讲述了java生成XML的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;下拉框的生成&#xff0c;我是通过javascript读取xml文件生成的。Xml文件是根据数据库生成的。Xml文件只相当于页面到数据库的一道缓存。这样利于性能。生成xml文件又是一件繁琐的事情。…...