当我们已经拥有更强大的向量时,为啥还需要堆栈?

     2023-02-21     53

关键词:

【中文标题】当我们已经拥有更强大的向量时,为啥还需要堆栈?【英文标题】:Why do we need stacks when we already have vectors which are even more powerful?当我们已经拥有更强大的向量时,为什么还需要堆栈? 【发布时间】:2021-11-03 11:09:18 【问题描述】:

在 C++ STL 中,堆栈是使用容器适配器实现的,这些适配器重写了 Vector 类的接口。但是,既然已经有了 Vector 类,为什么还要重写接口并设计一个 Stack 类呢?是因为成本效率,即维护堆栈使用更少的资源,而它可以完成所有必要的工作吗?

【问题讨论】:

注意std::stack默认使用std::deque实现 更强大和更灵活并不意味着更好。限制一个类的功能通常意味着更安全或更清晰的代码,这是它自己衡量“更好”的标准。 【参考方案1】:

当我们已经拥有更强大的 goto 时,为什么还需要 for 循环和 while 循环?您应该坚持简约原则 - 使用功能最弱但功能强大到足以实现预期目标的工具。

如果您需要的是堆栈,请依赖提供该功能的标准库类,而不是更强大的。它还可以更好地与阅读您的代码的人交流您将要做什么。

【讨论】:

“交流”位是一个非常好的点。如果我正在调试一个声明std::vector<int> stack 的代码块,我不一定认为该代码将其严格视为堆栈。如果它声明std::stack<int> stack,我可以相信。【参考方案2】:

容器适配器背后的想法是在其他开放式容器类型上强制执行特定的抽象数据类型。如果您有std::vector,则可能会无意中在中间插入/擦除/访问元素;但如果你有std::stack,你就知道这不会发生。类似于const:你告诉编译器要应用什么限制,这样当你不小心违反它们时它就会告诉你。

IME,人们并不经常使用stackqueuepriority_queue 更有用一点。但在每种情况下,人们往往会发现需要稍微打破规则的奇怪特殊情况,这意味着要放弃原则性过于严格的容器适配器。

【讨论】:

当我们有一个红色区域时,为啥我们需要堆栈分配?

】当我们有一个红色区域时,为啥我们需要堆栈分配?【英文标题】:Whydoweneedstackallocationwhenwehavearedzone?当我们有一个红色区域时,为什么我们需要堆栈分配?【发布时间】:2016-10-2220:18:01【问题描述】:我有以下疑惑:众所周... 查看详情

为啥我们需要使用rabbitmq

】为啥我们需要使用rabbitmq【英文标题】:Whydoweneedtouserabbitmq为什么我们需要使用rabbitmq【发布时间】:2011-07-0504:41:53【问题描述】:当我们在Python中有一个更强大的网络框架Twisted时,为什么还需要RabbitMQ。我试图了解有人想要... 查看详情

当我们有常规数组时,为啥我们需要指向数组的指针?

】当我们有常规数组时,为啥我们需要指向数组的指针?【英文标题】:Whydoweneedpointerstoarrayswhenwehaveregulararrays?当我们有常规数组时,为什么我们需要指向数组的指针?【发布时间】:2021-08-0510:44:35【问题描述】:当我们已经有... 查看详情

当我们有客户端会话时,为啥我们需要 JWT?

】当我们有客户端会话时,为啥我们需要JWT?【英文标题】:WhydoweneedJWTwhenwehaveclientsessions?当我们有客户端会话时,为什么我们需要JWT?【发布时间】:2015-07-1121:56:00【问题描述】:我了解JWT是无状态令牌,用于存储有关客户端... 查看详情

封装——当设置器已经公开时,为啥我们需要它? [复制]

】封装——当设置器已经公开时,为啥我们需要它?[复制]【英文标题】:Encapsulation-whydoweneeditwhensettersarealreadypublic?[duplicate]封装——当设置器已经公开时,为什么我们需要它?[复制]【发布时间】:2015-12-1217:29:46【问题描述】... 查看详情

当我们已经准备好后端时,为啥还需要 Express 服务器

】当我们已经准备好后端时,为啥还需要Express服务器【英文标题】:WhydoweneedExpressserverwhenwehaveabackendreadyalready当我们已经准备好后端时,为什么还需要Express服务器【发布时间】:2017-06-1612:10:33【问题描述】:我对javascript和web应... 查看详情

当Apache已经可以拥有JVM时为啥要发明Tomcat [关闭]

】当Apache已经可以拥有JVM时为啥要发明Tomcat[关闭]【英文标题】:WhyinventTomcatwhenApachecanalreadyhaveJVM[closed]当Apache已经可以拥有JVM时为什么要发明Tomcat[关闭]【发布时间】:2015-01-1305:45:41【问题描述】:我之前使用过ApacheWeb服务器,... 查看详情

Data Vault 2.0 - 当我们有信息集市时,为啥我们需要业务保险库?

】DataVault2.0-当我们有信息集市时,为啥我们需要业务保险库?【英文标题】:DataVault2.0-whydoweneedbusinessvaultwhenwehaveinformationmarts?DataVault2.0-当我们有信息集市时,为什么我们需要业务保险库?【发布时间】:2016-06-0723:23:38【问题描... 查看详情

Angular JS:当我们已经有了具有作用域的指令控制器时,还需要指令的链接函数吗?

】AngularJS:当我们已经有了具有作用域的指令控制器时,还需要指令的链接函数吗?【英文标题】:AngularJS:Whatistheneedofthedirective’slinkfunctionwhenwealreadyhaddirective’scontrollerwithscope?【发布时间】:2013-11-2920:59:54【问题描述】:我需... 查看详情

当我们在 TCP 数据包中有端口号时,为啥我们在 HTTP 的 HOST 标头中需要端口号?

】当我们在TCP数据包中有端口号时,为啥我们在HTTP的HOST标头中需要端口号?【英文标题】:WhydoweneedportnumberinHOSTheaderofHTTPwhenwehaveportnumberinTCPpacket?当我们在TCP数据包中有端口号时,为什么我们在HTTP的HOST标头中需要端口号?【发... 查看详情

当 set 在 Java 中已经是原子的时,为啥我们需要 compareAndSet?

】当set在Java中已经是原子的时,为啥我们需要compareAndSet?【英文标题】:WhydoweneedtocompareAndSetwhensetisalreadyatomicinJava?当set在Java中已经是原子的时,为什么我们需要compareAndSet?【发布时间】:2016-06-0903:40:11【问题描述】:因为原... 查看详情

当 SwiftUI 已经导入时,为啥我需要导入 Combine?

】当SwiftUI已经导入时,为啥我需要导入Combine?【英文标题】:WhydoIneedtoimportCombinewhenSwiftUIalreadyimportsit?当SwiftUI已经导入时,为什么我需要导入Combine?【发布时间】:2021-05-0205:08:53【问题描述】:我正在尝试收听@State的变化并关... 查看详情

为啥我们已经有了 mapDispatchToProps 还需要 redux-thunk

】为啥我们已经有了mapDispatchToProps还需要redux-thunk【英文标题】:Whydoweneedredux-thunkwhenwealreadyhavemapDispatchToProps为什么我们已经有了mapDispatchToProps还需要redux-thunk【发布时间】:2017-11-1313:36:47【问题描述】:Redux-thunk允许您创建返回... 查看详情

为啥在这段代码中向量比指针使用更少的内存?

】为啥在这段代码中向量比指针使用更少的内存?【英文标题】:whyvectoruselessmemorythanpointersinthiscode?为什么在这段代码中向量比指针使用更少的内存?【发布时间】:2015-05-2816:37:48【问题描述】:我使用指针编写了基于Strassen乘... 查看详情

MIPS:为啥我们需要堆栈? [复制]

】MIPS:为啥我们需要堆栈?[复制]【英文标题】:MIPS:Whydoweneedthestack?[duplicate]MIPS:为什么我们需要堆栈?[复制]【发布时间】:2018-11-0207:08:03【问题描述】:MIPS中堆栈的用途是什么,我们为什么需要它?有人可以提供一个相关... 查看详情

学习总结(代码片段)

...存在于它所属的类。而每个类都有它自身的属性和方法,我们通过对对象的属性和方法的归纳将特定的对象归为一类。我们只需要建立一个类,给这个类定义好对象需要的属性和方法,所有该类对象都可以通过new类来快速使用它... 查看详情

当我们已经有 CROSS_COMPILE= 时为啥还要有 ARCH=

】当我们已经有CROSS_COMPILE=时为啥还要有ARCH=【英文标题】:WhyhavingtheARCH=whenwealreadyhaveCROSS_COMPILE=当我们已经有CROSS_COMPILE=时为什么还要有ARCH=【发布时间】:2022-01-1612:43:09【问题描述】:这个问题对你们中的一些人来说可能听起... 查看详情

当我们可以用 setter 做同样的事情时,为啥我们需要使用 builder 设计模式? [复制]

】当我们可以用setter做同样的事情时,为啥我们需要使用builder设计模式?[复制]【英文标题】:Whydoweneedtousethebuilderdesignpatternwhenwecandothesamethingwithsetters?[duplicate]当我们可以用setter做同样的事情时,为什么我们需要使用builder设计... 查看详情