腾冲网站建设/外贸seo软文发布平台

腾冲网站建设,外贸seo软文发布平台,免费域名网站申请,中国建设银行网站会员注册信息补充注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 遍历聚合对象的统一方式 1. 模式定义与用途 核心思想 ​迭代器模式:提供一种方法顺序访问聚合对象的元素,而无需暴露其内部表示。关键用途: 1.​统一…

注意:复现代码时,确保 VS2022 使用 C++17/20 标准以支持现代特性。

遍历聚合对象的统一方式


1. 模式定义与用途

核心思想

  • 迭代器模式:提供一种方法顺序访问聚合对象的元素,而无需暴露其内部表示。
  • 关键用途
    1.​统一遍历接口:为不同数据结构(如数组、链表、树)提供一致的遍历方式。
    ​2.支持多种遍历策略:前向、反向、条件过滤等。
    ​3.简化聚合类设计:将遍历逻辑从聚合类中分离。

经典场景

  • STL容器的迭代器(如std::vector::iterator)。
  • 自定义集合类(如链表、图)的遍历。
  • 数据库查询结果的逐行遍历。

2. 模式结构解析

UML类图

+---------------------+          +---------------------+  
|      Aggregate      |          |       Iterator       |  
+---------------------+          +---------------------+  
| + createIterator()  |<>------->| + next(): void       |  
+---------------------+          | + hasNext(): bool    |  ^                      +---------------------+  |                                ^  |                                |  +-------+-------+              +---------+---------+  |               |              |                   |  
+---------------------+    +-------------------+ +----------------+  
| ConcreteAggregate   |    |  ConcreteIterator | |     Client      |  
+---------------------+    +-------------------+ +----------------+  
| + createIterator()  |    | + next()          | | 通过迭代器遍历聚合对象 |  
+---------------------+    | + hasNext()       | +----------------+  +-------------------+  

角色说明

  1. Aggregate:聚合接口,定义创建迭代器的方法(如createIterator())。
  2. ConcreteAggregate:具体聚合类,实现迭代器创建逻辑。
  3. Iterator:迭代器接口,定义遍历方法(如next()hasNext())。
  4. ConcreteIterator:具体迭代器,实现特定遍历逻辑。
  5. Client:通过迭代器访问聚合对象,无需依赖其内部结构。

3. 现代C++实现示例

场景:自定义链表迭代器

步骤1:定义链表节点与聚合类
#include <iostream>  
#include <memory>  template <typename T>  
class ListNode {  
public:  T value;  std::shared_ptr<ListNode<T>> next;  ListNode(T val) : value(val), next(nullptr) {}  
};  // 聚合类:单向链表  
template <typename T>  
class LinkedList {  
public:  void append(T value) {  auto newNode = std::make_shared<ListNode<T>>(value);  if (!head_) {  head_ = newNode;  } else {  tail_->next = newNode;  }  tail_ = newNode;  }  // 创建正向迭代器  class Iterator;  Iterator begin() { return Iterator(head_); }  Iterator end() { return Iterator(nullptr); }  private:  std::shared_ptr<ListNode<T>> head_ = nullptr;  std::shared_ptr<ListNode<T>> tail_ = nullptr;  
};  
步骤2:实现迭代器类
template <typename T>  
class LinkedList<T>::Iterator {  
public:  Iterator(std::shared_ptr<ListNode<T>> node) : current_(node) {}  T& operator*() const { return current_->value; }  Iterator& operator++() {  if (current_) current_ = current_->next;  return *this;  }  bool operator!=(const Iterator& other) const {  return current_ != other.current_;  }  private:  std::shared_ptr<ListNode<T>> current_;  
};  
步骤3:客户端代码
int main() {  LinkedList<int> list;  list.append(1);  list.append(2);  list.append(3);  // 使用范围for循环(依赖begin()和end())  for (auto num : list) {  std::cout << num << " ";  // 输出:1 2 3  }  // 手动迭代  auto it = list.begin();  while (it != list.end()) {  std::cout << *it << " ";  ++it;  }  
}  
扩展:反向迭代器
template <typename T>  
class LinkedList<T>::ReverseIterator {  
public:  ReverseIterator(std::shared_ptr<ListNode<T>> head) {  // 遍历链表,将节点指针存入栈以实现反向  auto curr = head;  while (curr) {  stack_.push(curr);  curr = curr->next;  }  }  T& operator*() { return stack_.top()->value; }  ReverseIterator& operator++() {  if (!stack_.empty()) stack_.pop();  return *this;  }  bool operator!=(const ReverseIterator& other) {  return !stack_.empty() || !other.stack_.empty();  }  private:  std::stack<std::shared_ptr<ListNode<T>>> stack_;  
};  

4. 应用场景示例

场景1:树结构的深度优先遍历

class TreeNode {  
public:  int value;  std::vector<std::shared_ptr<TreeNode>> children;  
};  class DepthFirstIterator {  
public:  DepthFirstIterator(std::shared_ptr<TreeNode> root) {  stack_.push(root);  }  std::shared_ptr<TreeNode> next() {  auto node = stack_.top();  stack_.pop();  for (auto it = node->children.rbegin(); it != node->children.rend(); ++it) {  stack_.push(*it);  }  return node;  }  bool hasNext() { return !stack_.empty(); }  private:  std::stack<std::shared_ptr<TreeNode>> stack_;  
};  

场景2:过滤迭代器(条件遍历)

template <typename T, typename Predicate>  
class FilterIterator {  
public:  FilterIterator(typename LinkedList<T>::Iterator it, Predicate pred)  : it_(it), pred_(pred) {  // 找到第一个满足条件的元素  while (it_ != end_ && !pred_(*it_)) ++it_;  }  T& operator*() { return *it_; }  FilterIterator& operator++() {  do { ++it_; } while (it_ != end_ && !pred_(*it_));  return *this;  }  bool operator!=(const FilterIterator& other) { return it_ != other.it_; }  private:  typename LinkedList<T>::Iterator it_;  typename LinkedList<T>::Iterator end_;  Predicate pred_;  
};  // 使用示例:遍历链表中的偶数  
auto isEven = [](int x) { return x % 2 == 0; };  
FilterIterator<int, decltype(isEven)> begin(list.begin(), isEven);  
FilterIterator<int, decltype(isEven)> end(list.end(), isEven);  
while (begin != end) {  std::cout << *begin << " ";  ++begin;  
}  

5. 优缺点分析

​优点​缺点
解耦遍历逻辑与数据结构增加类的数量(迭代器与聚合类需配对)
支持多种遍历策略(正向、反向等)复杂数据结构迭代器实现成本高(如图遍历)
隐藏聚合对象内部实现部分语言/框架已内置迭代器(如STL)

6. 调试与优化策略

调试技巧(VS2022)​

1.​验证迭代器有效性:
  • 在迭代器越界时触发断言:
T& operator*() {  assert(current_ != nullptr && "迭代器越界!");  return current_->value;  
}  
2. ​检查迭代器状态:
  • operator++()中设置断点,观察指针移动是否符合预期。

性能优化

1. 预计算遍历路径:
  • 对树或图的遍历,预计算路径并缓存结果(如广度优先遍历队列)。
2. 内存连续性优化:
  • 使用std::vector存储节点,利用内存局部性提升遍历速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】

问题需求 目录和文件结构如下&#xff1a; E:\Dir_Level1 │ Level1.txt │ └─Dir_Level2│ Level2.txt│ master.xlsx│└─Dir_Level3Level3.txt现在要在master.xlsx点击单元格进而访问Level1.txt、Level2.txt、Level3.txt这些文件。 方法一&#xff1a;“单元格右键…

聚类中的相似矩阵和拉普拉斯矩阵

前言&#xff08;可以略过&#xff09; 最近在看的是关于聚类的论文&#xff0c;之前对聚类的步骤和相关内容不太了解&#xff0c;为了读懂论文就去学习了一下&#xff0c;这里将自己的理解记录下来。学习的不全面&#xff0c;主要是为了看懂论文&#xff0c;后续如果有涉及到聚…

前端笔记 --- vue框架

目录 基础知识 指令的修饰符 计算属性 watch侦听器的写法 Vue的生命周期 工程化开发&脚手架 VUE CLI 组件注册的方式 scoped样式冲突与原理 data 组件之间的关系和组件通信 v-model详解 sync修饰符 Dom介绍 操作HTML标签 总结 ref 和 $refs $nextTick 自…

智能双剑合璧:基于语音识别与大模型的技术沙龙笔记整理实战

智能双剑合璧&#xff1a;基于语音识别与大模型的技术沙龙笔记整理实战 ——记一次网络安全技术沙龙的高效知识沉淀 引言&#xff1a;当网络安全遇上AI生产力工具 在绿盟科技举办的"AI驱动的未来网络安全"内部技术沙龙中&#xff0c;笔者亲历了一场关于网络安全攻…

数据结构(蓝桥杯常考点)

数据结构 前言&#xff1a;这个是针对于蓝桥杯竞赛常考的数据结构内容&#xff0c;基础算法比如高精度这些会在下期给大家总结 数据结构 竞赛中&#xff0c;时间复杂度不能超过10的7次方&#xff08;1秒&#xff09;到10的8次方&#xff08;2秒&#xff09; 空间限制&#x…

第56天:Web攻防-SQL注入增删改查盲注延时布尔报错有无回显错误处理审计复盘

#知识点 1、Web攻防-SQL注入-操作方法&增删改查 2、Web攻防-SQL注入-布尔&延时&报错&盲注 一、增删改查 1、功能&#xff1a;数据查询 查询&#xff1a;SELECT * FROM news where id$id 2、功能&#xff1a;新增用户&#xff0c;添加新闻等 增加&#xff1a;IN…

串口通信函数汇总-ing

谢谢各位佬的阅读&#xff0c;本文是我自己的理解&#xff0c;如果您发现错误&#xff0c;麻烦请您指出&#xff0c;谢谢 首先谈谈我自己对于串口的理解&#xff0c;随便拿一个嵌入式的板子&#xff0c;它上面有两个引脚&#xff0c;一个是rx&#xff0c;一个是tx&#xff0c;r…

如何用HTML5 Canvas实现电子签名功能✍️

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&#…

2024年广州市智能网联汽车创新实践年度报告

政策法规方面&#xff0c;积极推进《广州市智能网联汽车创新发展条例》的制定和发布&#xff0c;不断完善法规标准体系&#xff0c;为产业创新发展营造良好政策环境&#xff1b;技术创新方面&#xff0c;企业加大研发投入&#xff0c;在自动驾驶算法、车联网安全等关键领域取得…

计算机操作系统(一) 什么是操作系统

计算机操作系统&#xff08;一&#xff09; 什么是操作系统 前言一、什么是操作系统二、操作系统的作用三、推动操作系统发展的主要动力总结&#xff08;核心概念速记&#xff09;&#xff1a; 前言 当你打开电脑、点击应用、播放音乐时&#xff0c;是谁在背后默默协调这一切&…

韦伯望远镜的拉格朗日点计算推导过程,包含MATLAB和python运动轨迹仿真代码

研究过程 起源与提出&#xff1a;1687 年牛顿提出 “三体问题”&#xff0c;旨在研究三个可视为质点的天体在相互之间万有引力作用下的运动规律&#xff0c;但因运动方程过于复杂&#xff0c;难以得到完全解。欧拉的贡献1&#xff1a;1767 年&#xff0c;瑞士数学家莱昂哈德・…

Gateway:网关路由与登录鉴权

在微服务架构中&#xff0c;用户登录和身份校验的处理方式确实与单体应用有所不同。在单体架构中&#xff0c;一旦用户通过身份验证&#xff0c;其会话信息可以在整个应用范围内共享&#xff0c;所有模块都能访问到用户信息。然而&#xff0c;在微服务架构下&#xff0c;每个服…

Vision Transformer (ViT):将Transformer带入计算机视觉的革命性尝试(代码实现)

Vision Transformer (ViT)&#xff1a;将Transformer带入计算机视觉的革命性尝试 作为一名深度学习研究者&#xff0c;如果你对自然语言处理&#xff08;NLP&#xff09;领域的Transformer架构了如指掌&#xff0c;那么你一定不会对它在序列建模中的强大能力感到陌生。然而&am…

prompt大师高效提示词解析

Prompt大师李继刚高效提示词示例解析 一、「汉语新解」提示词 核心结构 采用Lisp语言框架嵌套中文语义&#xff0c;通过(defun 新汉语老师 ()...)定义角色风格&#xff08;融合奥斯卡王尔德、鲁迅的批判性语言&#xff09;&#xff0c;用(隐喻 (一针见血...))构建解释逻辑链。…

基于 Vue 的Deepseek流式加载对话Demo

目录 引言组件概述核心组件与功能实现1. 消息显示组件&#xff08;Message.vue&#xff09;2. 输入组件&#xff08;Input.vue&#xff09;3. 流式请求处理&#xff08;useDeepseek.ts&#xff09;4. 语音处理模块&#xff08;Voice.vue&#xff09; 总结Demo Github 地址 引言…

WPS二次开发系列:Android 第三方应用如何获取WPS端内文档

1.需求场景 在项目开发中碰到这种情况&#xff0c;我们需要利用WPS的文档管理能力&#xff0c;比如需要调用WPS的文件选择器&#xff0c;来选择文档&#xff0c;同时需要得到WPS选择的文档结果返回给我们的应用。之前在网上找到了很久都没有找到WPS移动端有相关的API接口文档和…

Flutter 基础组件 Text 详解

目录 1. 引言 2. 基本使用 3. 自定义样式 4. 文本对齐与溢出控制 5. 外边距 5.1 使用 Container 包裹 5.2 使用 Padding 组件 5.3 在 Row/Column 中使用 5.4 动态边距调整 5.5 关键区别说明 5.6 设置 margin 无效 6. 结论 相关推荐 1. 引言 Text 组件是 Flutter 中…

Acknowledgment.nack方法重试消费kafka消息异常

文章目录 问题示例异常 原因nack方法Acknowledgment接口实现类&#xff1a;ConsumerAcknowledgment实现类&#xff1a;ConsumerBatchAcknowledgment 解决方案1 批量消费指定index示例 2 单条消费示例 问题 使用BatchAcknowledgingMessageListener 批量消费Kafka消息&#xff0…

Java 反序列化 - commons collection 之困(一)

#01多余的碎碎念 说到 java 反序列化&#xff0c;去搜索的话能看到网上有很多分析关于 commons collection 利用链的文章&#xff0c;emm 我一开始看不懂&#xff0c;看到很多代码的图头晕。 这篇文章的话其实是我跟着 p 神的文章一路走下来的&#xff0c;所以整个逻辑会按照…