Item 2:抛弃写“容器无关”的代码的幻想

GMI Cloud Inference Engine:让GLM 5.1代码能力即插即用 Cloud Inference Engine 是一种面向代码场景优化的模型服务协议栈,其核心原理是将大模型推理能力抽象为标准化通信契约,屏蔽底层硬件与部署差异,实现低延迟、结构化、上下文感知的远程推理调用。该技术显著降低AI编程工具链的接入门槛,无需GPU、CUDA或本地模型部署,即可在任意开发环境(如VS Code、Vim、CI/CD)中稳定调用GLM 5.1等专业代码模型。其技术价值体现在工程化封装长上下文处理、流式响应、跨文件语义关联等关键能力,并天然支持企业内网、教育终端与DevOps流水线等典型应 阅读详情
 
标题  Item 2:抛弃写“容器无关”的代码的幻想     选择自 pongba 的 Blog
关键字  Item 2:抛弃写“容器无关”的代码的幻想
出处 

                            Item 2:抛弃写“容器无关”的代码的幻想

                                          scott meyers   著
                                          刘未鹏          译
                                    
 

    STL建立在泛型的基础之上。数组(arrays)被泛化成为容器,并以它们所包含的对象的类型为模板参数。函数(functions)被泛化成算法,并以它们所接纳的迭代器的类型为模板参数。指针被泛化成迭代器,并以它们所指向的对象的类型为模板参数。

   

    然 而这仅仅是个开始。个别的容器类型被泛化成为序列式容器和关联式容器。相似的容器被赋予相似的泛函性(functionality,或“功能性”)。标准 的“内存连续式”容器提供随机存取迭代器,标准的node-based容器提供双向迭代器。序列式容器支持push_front或push_back,关 联式容器却不支持。关联式容器提供算法复杂度为对数时间的 lower_bound,upper_bound和equal_range成员函数,然而序列式容器却不提供。

 

   很 自然的,你也想加入这个泛化的行动中来,这值得赞扬,并且当你写你自己的容器、迭代器和算法时,你当然想尝试着这样做。然而有许多程序员却用错了方式—— 他们并不是让代码依赖于某种特定的容器,而是试图将容器的概念泛化,从而试图达到这样一种目的——当前使用某一种容器,如vector,以后又能够在不改变其它代码的前提下透明地将容器替换成其它类型(如换成deque、list等)。这也就是说,他们努力去写“ 容器无关”的代码。这种泛化虽然意图是好的,然而——几乎可以肯定的说——这是个误导。

 

    即 使是“容器无关”代码的最热心的鼓吹者不久也会意识到:试图去写能同时和序列式容器及关联式容器工作的代码几乎是没有意义的。许多成员函数只在某一种特定 类型的容器中存在。例如:只有序列式容器支持push_front和push_back,只有关联式容器支持count和lower_bound,等等。 即使是erase和insert这样基本的操作在不同容器类别之间都有着语义上的差别。比如,当你插入一个元素至序列式容器中时,它将会呆在你将它放置的地方。然而在关联式容器中,它会按照容器的排序方式被移至某个恰当的地点。再举个例子,在序列式容器上调用erase会返回一个新的迭代器,而在关联式容器上则什么也不返回(条款9说明了这将如何影响你的代码)。

   

    好吧,假设你热切盼望能够写出能与大多数通常的容器如vector、list、deque一起工作的代码。显然,你的代码必须只用到它们的能力的交集(译 注:假设你使用了容器A有而容器B没有的功能,则当容器A换成B时你的代码将不能工作)——这意味着你得放弃使用reserve和capacity(条款 14),因为deque和list并不提供它们。有list的到场意味着你又不能使用operator[],你还把自己限制在双向迭代器的能力范围内—— 那又意味着你将不能使用需要随机存取式迭代器的算法(例如:sort,stable_sort,partial_sort,nth_element(条款 31))。

 

    另 一方面,你支持vector的愿望将push_front和pop_front踢出场外(译注:因为vector根本没有这两个操作),如果你希望支持 deque或vector,则你将不能使用splice和成员形式的sort。后者(译注:即不能使用splice和成员形式的sort)意味着在你的 “泛化的序列式容器”上你不能调用任何形式的sort。

 

    以上只是一些较为明显的事实。如果你违反其中任何一条限制,在你所要使用的所有容器中至少有一种会使你的代码通不过编译。而那些能通过编译的代码则会隐藏着更大的危险。

 

    导 致这些问题的罪魁祸首就是各种序列式容器间有关迭代器、指针、引用失效的不同协定。要写出能正确地和vector,deque,list同时工作的代码, 你必须假设任何操作都会使所有的迭代器、指针、引用失效。因此,你必须假设在你所使用的任何容器上调用insert都会使它们的任何迭代器、指针、引用失 效——而这不过仅仅是由于deque::insert()会使所有迭代器失效。并且由于缺少调用capacity的能力,你就必须假设vector:: insert()会使指向它内部的所有指针和引用失效(条款1解释了对于deque——某些时候——在它的迭代器失效的同时指针和引用却不失效)。出于类 似的原因,每次调用erase你得做同样的打算。

   

    想 要知道更多吗?你不能将容器中的数据传给C风格的接口(C-interface)。因为仅有vector支持这种行为(条款16),你不能存储bool型 别的变量,因为正如条款18所解释的,vector<bool>并不总是表现得像个vector,它也从不真的存储bool值。你不能假定 list的常数时间的插入和擦除动作,因为vector和deque在这些操作上需要耗线性时间。

   

    当 所有该说的都说完了,该做的都做完了,你就只剩下了如下的这个“泛化的序列式容器”:在这个容器上,你不能调用reserve,capacity, operator[],push_front,pop_front,splice,或是任何需要接受随机存取迭代器的算法;你得假设任何insert和 erase会消耗线性时间,并会使所有迭代器、指针、引用失效;你还得假设这个容器与C风格不兼容,并且不能保存bool值。这真的是你期望在程序中使用 的容器吗?我怀疑不是!

   

    如 果你收敛一下野心,决定愿意放弃对list的支持,则你仍然要放弃reserve,capacity,push_front,pop_front;你仍然 必须假定所有对insert和erase的调用消耗线性时间,并使所有迭代器、指针、引用失效。你仍然失掉与C风格的兼容;你仍然不能存储bool值。

 

    如 果你放弃序列式容器,然后争取让你的代码能和不同的关联式容器一同工作,情况并不会变得更好一些——写同时支持set和map的代码近乎不可能。因为 sets存储单独的对象,而maps存储一对对象。甚至写同时支持set和multiset(或是map和multimap)的代码都是艰难的。因为只接 受一个值的insert成员函数在set/map和它们的兄弟multiset/multimap身上具有不同的返回值型别。你还必须避免作出对“到底有 多少个值的拷贝存在于容器中”的假定。你不能调用operator[]——因为它只在map中存在。

 

    面对事实吧——不值得这样做!不同的容器是处于两个不同世界的东西,有各自的规则,有不同的强大之处和弱点。它们并非被设计为可互换的。你对此无能为力。如果你去尝试,你只不过是在冒险,而且注定经不起考验。

 

    当 你意识到你所选择的容器是不理想的,你得去使用别的类型的容器时,黎明就到来了。你现在知道了,当你改变所使用的容器时,你不只是要改正编译器给你诊断出 的错误,你还需要检查使用新容器的所有代码,看看在新容器的性能特征和iterator,pointer,reference失效的规则之下还有什么需要 改变的。如果你从vector转而使用别的容器,你得确认你已经不再依赖于vector的C风格兼容的内存分配形式。如果你从别的容器转向vector, 你得确认你没有使用它来存储bool值。

 

    鉴于有时你必须得改变容器,你可以使这种改变更容易一些,通常,经过包装,包装,再包装。最简单的方法之一,是对容器和迭代器使用typedefs的自由形式,因此将下面的代码:

         class Widget{...};

         vector<Widget> vw;

         Widget bestWidget;

         ...                       //give bestWidget a value

         vector<Widget>::iterator i=    //find a Widge with the

           find(vw.begin(),vw.end(),bestWidget);//same value as bestWidget

取代为:

         class Widget{...};

         typedef vector<Widget> WidgetContainer;

         typedef WidgetContainer::iterator WCIterator;

 

         WidgetContainer cw;

 

         Widget bestWidget;

         ...

         WCIterator i=find(cw.begin(),cw.end(),bestWidget);

 

    这使改变容器的类型变得相当容易。当只是给容器加一个自定义配置器时(这样的改变不会改变容器的iterator/pointer/reference失效规则),这会显得特别方便。

 

             class Widget{...};

 

             template<typename T>                        //see Item 10 for why this

             SpecialAllocator{...};                      //needs to be a template

 

             typedef vector<Widget,SpecialAllocator<Widget> > WidgetContainer;

             typedef WidgetContainer::iterator WCIterator;

 

             WidgetContainer cw;                          //still works

 

             Widget bestWidget;

             ...

 

             WCIterator i=find(cw.begin(),cw.end(),bestWidget); //still works

 

    如果这些对你并不代表什么,你也得感激它们能为你省下的工作,举个例子,如果你有个型别为:

 

             map<string,vector<Widget>::iterator,CIStringCompare> 

               //CIStringCompare is "case-insensitive string compare;"

               //Item 19 describes it

的对象,你想用const_iterator遍历map,你真的想拼写下面的代码?

 

                       map<string,vector<Widget>::iterator,CIStringCompare>::const_iterator

 

    如果你要用到不止一次呢?一旦你用STL一段时间后,你会意识到typedef是你的朋友。

 

    一个typedef只是为其他的型别起一个别名。所以这只是提供纯粹字面上的包装。一个typedef并不阻止客户端做(或依赖)他们已经能做(或依赖)的。如果想要避免将你对容器的选择暴露给客户端,你需要更强力的措施——class。

    

    当你用一个容器替换现有容器时,为了限制所要改动的代码的量,你可以将容器隐藏在class内部,并限制从class的接口显露出的容器相关(container-specific)的信息的量。例如,如果你需要创建一个顾客列表(customer list),不要直接用list(指STL容器的list)。你可以创建一个新的CustomerList类,将list作为它的私有成员隐藏起来。

 

            class CustomerList{                        

            private:                                   

            typedef list<Customer> CustomerContainer;

            typedef CustomerContainer::iterator CCIterator;

 

            CustomerContainer customers;

            public:           //limit the amount of list-specific

            ...               //infomation visible through this interface

};

 

    起初,这看起来可能有些莫名其妙——毕竟一个customer list也是一个list,不是么?好吧,或许,再后来你会发现你并不需要像你预期的那样频繁地从顾客列表中部增加或删减消费者,但是你开始需要快速标识出你的顾客中的前20%(可能是消费量最大的)--这正是nth_lement算法特定的任务(条款31),然而nth_element需要随机存取迭代器,所以它不能和list合作(译注:list的迭代器是双向的却不是随机的),在这种情况下你的customer "list"最好用一个vector或deque来实现。

 

当你考虑了这种变化后,你还得检查CustomerList的每个成员函数和友员函数以考察它们所受到的影响(因底部容器的性能因素和iterator/pointer/reference失效性),作出可能需要的相应的改变。但是如果你将CustomerList的实现细节封装得很好,则CustomerList内部容器的变化对客户端的影响就会很小。你不能写出容器无关(container-independent)的代码,但你的客户或许可以(译注:在上例中,如果CustomerList封装得够好的话)。

 


相关文章
DeepSeek-R1/V2工程落地实践:一线工程师的本地化AI副驾驶 大模型在软件工程中的价值,不在于参数规模或基准测试分数,而在于能否深度嵌入开发、运维与测试的真实工作流。本文聚焦代码理解、日志分析、文档生成等高频工程任务,解析如何将DeepSeek-R1/V2模型通过轻量级智能体架构,实现低延迟、高可控的本地化部署。核心围绕INT4量化精度保持、A10显卡推理优化、结构化Prompt工程约束、VS Code插件深度集成及规则+模型混合日志分析等关键技术路径,解决幻觉抑制、上下文切换成本高、CI/CD集成难等一线痛点,让AI真正成为可信赖的‘数字副驾驶’。 阅读详情

相关推荐

PDF表格提取实战:从底层渲染原理到工业级稳定方案

PDF表格提取本质是还原页面中文字与线条的空间语义关系,而非读取结构化数据。其技术原理基于坐标定位、几何聚类与OCR识别三层机制,核心价值在于打通非结构化文档与结构化数据分析之间的关键链路。典型应用场景包括财务报表解析、政府公开文件处理、学术论文数据抽取及ERP系统对账单自动化。本文聚焦真实工程痛点——跨页错位、中文乱码、扫描件识别失败与工具选型失配,结合pdfplumber底层坐标分析和paddleocr端到端文档理解能力,提供可调试、可降级、可部署的PDF表格提取方法论。

342

《Effective STL》条款解读

条款01:慎重选择容器类型 vector、list和deque有着不同的复杂度,vector是默认使用的序列类型。当需要频繁在序列中间做插入和删除操作时,应使用list。当大多数插入和删除操作发生在序列的头部和尾部时,应使用deque。 可以将容器分为连续内存容器和基于节点的容器两类。连续内存容器把元素存放在一块或多块(动态分配的)内存中,当有新元素插入或已有的元素被删除时,同一块内存中的其他元素要向前或向后移动,以便为新元素让出空间,或者是填充被删除元素所留下的空隙。这种移动会影响到效率和异常安全性。

zhuikefeng的博客 1151

研究者自建AI信息过滤器:流水线式论文与新闻筛选系统

信息过滤器是应对学术信息过载的基础技术方案,其核心原理在于通过确定性规则与结构化流程,从多源异构数据中实现高精度、低误报的内容筛选。相比依赖概率决策的智能体(Agent)架构,流水线式设计保障了可调试性、可维护性与人力可控性,显著提升工程落地稳定性。该技术价值在科研场景尤为突出——支持arXiv预印本、NewsAPI新闻、邮件摘要等多源协同去重与语义过滤,并输出结构化摘要,直接服务于每日文献精读决策。本文聚焦一个真实研究者构建的轻量级AI信息过滤器实践,涵盖Brevol邮件排版、arXiv API元数据利用

weixin_34236869的博客 401

机器学习生产化实战:从Notebook到高可用模型服务

机器学习生产化(ML production)是指将离线训练好的模型稳定、可靠、可持续地部署到真实业务环境中运行的技术体系。其核心原理在于应对数据漂移(data drift)、服务稳定性、特征一致性与模型可监控性等工程挑战,技术价值体现在保障预测可信度、缩短迭代周期、降低运维成本。典型应用场景包括推荐系统、风控引擎、智能营销等需7×24小时响应的线上服务。本文聚焦真实落地中的关键决策——如ONNX模型序列化替代Pickle、轻量级容器化部署替代K8s过度设计、三级数据漂移防御机制——直击MLOps实践中最易被

diaoju3333的博客 385

Ubuntu 18.04 安装 Jenkins 的正确姿势:绕过 apt 用 WAR 包部署

Jenkins 是一款开源持续集成(CI)服务器,依赖 Java 运行环境并需与操作系统深度协同。其核心原理是基于 Servlet 容器(如 Winstone)运行 WAR 包,通过插件化架构扩展构建、版本控制和部署能力。技术价值在于实现自动化流水线、提升软件交付效率与可追溯性。典型应用场景包括 Java 项目编译测试、Git 触发构建、Docker 镜像打包等。然而在 Ubuntu 18.04 这类已停止维护的 LTS 系统上,官方 apt 源提供的 Jenkins 版本严重滞后(2.150.3),且强制

weixin_30555125的博客 483

服务器七道防线:从网络隔离到密钥生命周期的纵深防御体系

服务器安全不是单一工具或一次加固,而是覆盖网络层、系统层、运行时、数据层和审计层的纵深防御体系。其核心原理在于通过默认拒绝策略、最小权限控制、eBPF行为监控、静态数据加密与全链路日志溯源等技术手段,构建多层相互验证的主动免疫机制。这种架构显著提升攻击者横向移动、持久驻留和数据窃取的成本,广泛应用于金融API网关、电商结算节点及Java微服务等高敏生产环境,是保障Linux服务器在真实攻防对抗中持续存活的关键工程实践。

weixin_30787531的博客 384

本地AI编码高级用户指南:构建可控、可审计、可进化的代码智能流水线

本地AI编码并非简单在本地运行大模型,而是以‘控制权’为核心,围绕代码全生命周期构建的工程化智能体系。其本质是将模型推理、工具链集成、IDE协议适配与安全审计深度耦合,实现从需求解析、接口设计、单元测试生成到代码审查的端到端自动化。关键技术支撑包括AWQ量化保障数值精度、LSP层深度集成实现上下文感知补全、多模型协同分工提升任务匹配度,以及RAG+缺陷驱动微调强化领域合规性。该范式已广泛应用于金融、政企等对数据主权与代码质量有强审计要求的离线开发场景,成为云原生时代开发者构建自主可控AI编码能力的关键路径。

weixin_38166557的博客 403

Materials - UE5中的PivotPainter

可以使用3DS Max Script中的脚本(Pivot Painter)对模型进行处理,让每个Element都有自己的Pivot Point,来方便控制和制作一些特殊的顶点动画效果;

GT的虚幻引擎文档 1287

机器学习模型生产部署:从Notebook到高可用服务的实战指南

机器学习模型部署不是简单导出为API,而是构建具备数据契约、服务韧性与可观测性的生产级系统。其核心原理在于应对真实环境中的数据漂移、资源竞争与依赖不确定性,技术价值体现在保障低延迟、高可用与自动容错能力。典型应用场景覆盖电商推荐、金融风控和IoT预测等需实时推理的关键业务。本文聚焦模型落地中最易被忽视的12个生死细节,包括Pydantic数据校验、FastAPI异步中间件、Kubernetes探针调优及特征服务降级策略,直击‘能跑’不等于‘敢用’的根本矛盾。

weixin_30681615的博客 361

COMSOL多物理场仿真:瓷绝缘子电热耦合建模与优化策略

本文详细介绍了使用COMSOL Multiphysics进行瓷绝缘子电热耦合仿真的完整流程与优化策略。文章阐述了电热耦合效应的工程意义,并逐步讲解了从几何建模、材料定义、物理场设置到边界条件与网格划分的关键步骤。重点分析了如何通过焦耳热耦合实现电场与温度场的双向交互,以及如何利用仿真结果进行参数化优化和瞬态故障模拟,为提升电力设备可靠性提供有效的数字化设计工具。

n8m7b6v5c4的博客 882

知识见闻 - Salesforce公司发展史

不过,通过将自己开发的产品与公司收购的其它云产品进行结合,Salesforce可以为用户提供更多的产品种类,Salesforce可以继续强化自己的平台和产品套件属性,这一平台和套件的发展规模已经远远超出了一个单一的CRM的规模。他们围绕一个相对简单的产品向用户兜售云的概念,然后,他们开始开发其它产品,并寻找培育一个不断增长的生态系统的方法,最理想的情况是能驱动Salesforce的营收增长。现在,Salesforce通过打造更多的用例并改进自己产品的方式来直接应对竞争对手的竞争,从而捍卫自己现在的地位。

guoqx的专栏 1449

10-Q财报自动化解析:从PDF到结构化洞察的生产级流水线

财报分析是金融与企业战略决策的基础能力,其核心在于将非结构化PDF文档准确转化为可计算、可对标、可审计的结构化财务指标。这涉及PDF智能解析、领域专用OCR、财报语义理解、指标逻辑建模及合规溯源等关键技术环节。尤其在SEC 10-Q这类格式自由、术语专业、脚注干扰强的监管文件中,单纯依赖大模型会导致数值提取错误率超30%,而混合式架构(规则引擎+微调FinBERT+轻量OCR)可实现99.2%的字段级准确率与完整数据血缘追踪。该方案已广泛应用于券商研报生成、尽调支持与SaaS竞争情报系统,支撑分钟级产出同业

aijia7039的博客 543

华为项目TR5评审后发现了重大缺陷的应急处理经验

华为TR5评审后发现重大缺陷时,启动分级应急机制:1)缺陷分级:按严重性(致命/严重/一般)评估影响;2)应急响应:跨部门会议制定方案,冻结生产并调配资源;3)根因修复:通过RCA定位问题,设计变更后回归测试;4)变更管理:评审修复影响,调整发布策略;5)持续改进:记录缺陷闭环,优化流程。案例显示,软件闪退问题通过热修复补丁和代码重构解决。关键工具包括Jira、FMEA等,确保缺陷在量产前拦截,降低风险。

从技术实践立足,从项目管理方法论延伸思考 1068

ML模型服务化实战:可观测性、弹性伸缩与灰度发布

机器学习模型服务化是将训练完成的模型部署为稳定API的关键环节,其核心在于突破Notebook环境的确定性幻觉,应对真实数据流中的schema变更、缺失值、特征漂移等混沌问题。技术原理上需构建三层防御体系:API网关契约校验、输入适配器(Adapter)兼容处理、模型轻量推理;工程价值体现在保障业务连续性——如凌晨高负载下仍返回带trace_id的响应、支持秒级回滚与精准AB测试。典型应用场景包括电商实时推荐、金融反欺诈API、工业预测性维护服务等。本文聚焦生产就绪(Production-Ready)模型服

congxian2511的博客 357

DRM驱动代码分析:展频 跳频

DRM驱动代码分析:展频 跳频

yuuu_cheer的博客 2669

基于STM32设计的智能家居控制系统(华为云)_363

本项目设计并实现了一种基于STM32的智能家居控制系统,融合了语音识别、远程控制、环境监测与安全报警等功能。系统以STM32F103C8T6单片机为核心控制器,集成ESP8266 Wi-Fi模块实现与华为云IOT物联网平台的数据交互,采用MQTT协议进行通信。用户可通过语音识别模块控制风扇、空调、窗帘、卧室灯、客厅灯和电视等家电的开关操作,同时也可通过Android手机APP或Windows电脑上位机进行远程控制。系统还具备温湿度、光照强度、烟雾浓度和火焰检测功能,当检测到异常情况时,自动触发蜂鸣器报警并向

878

生产级机器学习服务部署:从Notebook到高可用ML服务的实战路径

机器学习模型部署不是简单封装predict函数,而是构建具备可观测性、弹性与可维护性的生产服务。其核心在于理解服务化本质——模型需作为有状态、有生命周期的组件运行于动态混沌环境,而非静态数学函数。关键技术挑战包括资源隔离与内存管理、健康探针精细化配置、GPU显存优雅释放、数据漂移实时检测(PSI)及多维监控联动分析。真实场景中,数据格式突变、GPU抢占、依赖超时等‘现实混沌’倒逼架构必须支持熔断降级、动态限流与金丝雀发布。KServe等云原生ML服务框架通过Kubernetes原语,统一解决模型热重载、批量

weixin_34235457的博客 484

SE80 Repository Information System 在 SAP CRM WebClient UI 组件分析中的实战指南

在 SAP CRM WebClient UI 开发过程中,如何快速定位组件、视图、上下文节点以及各类运行时对象,一直是调试效率的关键。(后文简称RIS)正是隐藏在SE80里的瑞士军刀,帮助开发者按照组件集、数据元素、上下文节点属性等多维条件进行交叉检索。官方博客将它描述为本文结合多年项目经验,系统梳理RIS的功能脉络与实战技巧,同时引入真实案例,示范如何借助它在几分钟内完成以往动辄数小时的排查任务。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2万+

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 232

将 SAP BTP ABAP environment 与 SAP S/4HANA Cloud 公有云版集成:从架构理念到落地实战

本文探讨了在SAP云环境中实现ABAP扩展应用与S/4HANA Cloud系统集成的技术方案。通过建立标准化的远程通信通道,开发者可在SAP BTP ABAP环境中开发扩展应用,同时安全访问S/4HANA Cloud的核心业务数据和服务。文章详细介绍了整体架构设计、开发实现步骤(包括定义通信场景、生成服务消费模型和编写调用代码)以及管理员在S/4HANA侧的配置工作(创建通信安排和技术用户)。通过一个业务伙伴自助注册平台的案例,展示了如何在不修改标准系统的情况下实现云扩展,体现了SAP"干净核心&

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 236

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ArrayList 与 LinkedList 底层原理、性能对比

ArrayList 和 LinkedList 是 List 接口下最常用的两个实现类,也是 Java 后端面试高频考点。ArrayList 查询快增删慢,LinkedList 增删快查询慢,但这句话并不完全准确。本文从底层源码出发,分析两者存储结构、操作性能、使用场景,同时拆解常问坑点。为什么 ArrayList 线程不安全?多线程同时 add,可能出现数组越界、元素覆盖丢失。ArrayList 扩容为什么是 1.5 倍?平衡内存浪费与扩容次数,倍数太小频繁扩容拷贝;倍数太大浪费内存。

m0_63990694的博客 359

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【Java 集合】ListIterator 详解:next/set/add 到底怎么走?一次把 cursor 游标讲清楚

Iterator的next()和remove()只能单向遍历,只能删除,功能比较有限。如果需要双向遍历边走边改边走边插。很多人学的时候,代码能跑通,但一问他"add之后游标在哪、下一次next()读谁",就答不上来了。本质原因:ListIterator是一个"隐式游标"模型,游标永远夹在两个元素之间。而对游标的影响各不相同。这篇文章用 3 个递进的例子,把的游标行为一次性讲透。

weixin_68315058的博客 460

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

LeetCode //C - 1313. Decompress Run-Length Encoded List

The problem involves decompressing a run-length encoded list where each pair of adjacent elements in the input array represents a frequency and value. The solution requires expanding these pairs into the corresponding number of values in the output array.

Made in Code 219

Java 集合框架(List、Set、Map)与常用基础

本文整理Java集合框架核心知识,涵盖集合体系、Collection接口API、List(ArrayList、LinkedList、Vector)、Set(HashSet、TreeSet)、Map(HashMap、TreeMap、Hashtable)实现类原理、泛型、增强for循环、可变参数与工具类,并附核心易错点速查表。

既然你都点开这里了,那可以给我点个关注吗?可以吗?可以吗? 457

第7篇:常用组件:Text/Image/Button/List 实战拼页面

常用组件:Text/Image/Button/List 实战拼页面

信息安全领域优质创作者|操作系统领域专家 125

Scala List操作:不可变链表的函数式美学

Scala的List,表面上是Java List的"Scala版",本质上是函数式编程的核心数据结构——不可变的链表,配合模式匹配和递归,构成了声明式数据处理的基础。天然线程安全:不可变对象不需要锁,在多线程环境下可以安全共享结构共享:操作List时可以复用大部分结构,性能更好函数式友好:map/filter/reduce不修改原List,可以组合、可以嵌套这些特性不是孤立的,它们共同支撑了Scala的函数式编程范式。

https://starzy1990.github.io/ 1325
上一篇: STL中的map用法详解
下一篇: Effective STL 条款1
skyremember
博客等级 码龄20年 204粉丝 484原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值