如何有效地逐行迭代“Vec>”?

2024-04-11

我正在写一个图书馆,它采用了Vec<Vec<T>>类型以列优先顺序存储数据(每个内部Vec代表一列)。用户可以创建一个Vec<Vec<T>>具有任意行和列长度,但所有列都被限制为相同的长度。

有时我需要有效地迭代Vec<Vec<T>>按行。我不想更改数组类型,因为大多数时候我需要“按列向量”迭代(一次一个完整的列向量)。

除非我错过了什么,Iterator::zip不是一个选项,因为我事先不知道列向量的数量。Itertools::izip and Itertools::multizip也不可行。

这是我的示例代码:

let array = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
let mut iterators: Vec<_> = array.iter().map(|x| x.iter()).collect();
for _ in 0..array[0].len() {
    let values: Vec<_> = iterators.iter_mut().map(|x| x.next().unwrap()).collect();
    dbg!(values);
}

我应该定义一个可变的values在开始迭代之前进行向量以避免每个周期的分配,或者编译器无论如何都会处理这种优化?自己找到它的最简单方法是什么?

有更有效/惯用的解决方案吗?


一旦我有了迭代器向量,如何将其转换为向量迭代器?

创建迭代器有两种方法:使用现有的迭代器适配器或实现自定义迭代器。

让我们采用第二种方法并定义一个采用迭代器向量的自定义迭代器类型:

struct DynamicZip<I>
where I: Iterator {
    iterators: Vec<I>
}

让我们提供一个 Iterator 实现:

impl<I, T> Iterator for DynamicZip<I>
where I: Iterator<Item = T> {
    type Item = Vec<T>;
    fn next(&mut self) -> Option<Self::Item> {
        let output: Option<Vec<T>> = self.iterators.iter_mut().map(|iter| iter.next()).collect()
        output
    }
}

我们就完成了!

回到原来的例子

fn main() {
    let array = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
    let iterators: Vec<_> = array.into_iter().map(|v| v.into_iter()).collect();
    let dz = DynamicZip { iterators: iterators };
    // use the Iterator type we just defined
    for column in dz {
        println!("{:?}", column)
    }
}

将产生输出

[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效地逐行迭代“Vec>”? 的相关文章

随机推荐

  • 更改货币符号或将其在 inputmask 货币中删除

    我在用着Robin Herbot 的 inputmask jquery 插件 https github com RobinHerbots jquery inputmask我想将默认货币符号 默认情况下为美元货币符号 更改为 PESO 货币符
  • 如何使用 PHP 下载 HTML?

    如何从 PHP 中的 URL 下载 HTML 文件 并下载所有依赖项 例如 CSS 和图像 并将它们作为文件存储到我的服务器 我的要求是不是太多了 最简单的方法是使用wget http en wikipedia org wiki Wget
  • 如何从 PHP 数组为下拉选择字段创建嵌套列表?

    我的问题与本主题中描述的问题非常相似从 PHP 数组创建下拉选择字段的嵌套列表 https stackoverflow com questions 14613546 create nested list from php array for
  • 如何使用 Android Studio Arctic Fox 将 Android 库 aar 作为模块导入?

    我曾经能够将库 aar 文件导入为模块 https stackoverflow com a 34919810 355456他们一直工作得很好 我不知道如何使用最新版本的 Android Studio Arctic Fox 来做到这一点 有人
  • 从数据框中删除所有值为 NA、NULL 或空的列[重复]

    这个问题在这里已经有答案了 我有一个数据框 其中一些值为 NULL 或空 我想remove these columns其中所有值 are NULL or empty 应从数据框中删除列 而不仅仅是隐藏列 我的头 df 看起来像 data V
  • nginx + python + websocket

    我如何配置nginx 最新版本 他们说它支持websockets 来支持WebSockets 我如何使用 python 来运行 websockets 连接 这就是我想要的 客户端使用 JavaScript 创建 WebSocket webs
  • 自动调整 NumPy 重新数组的大小

    我想创建 numpy recarray 的子类 当数据添加到当前长度之外的行时 它会自动调整大小 下面的代码完成了我想要的大部分功能 class autorecarray numpy recarray def init self args
  • p:对话框在验证失败时不隐藏

    我遇到无法关闭 PrimeFaces 对话框的问题 输入字段 用户名 是必需的
  • 单个 Django 模型,多个表?

    我在 MySQL 数据库中有几个临时表 它们共享相同的架构并具有动态名称 我将如何使用 Django 与这些表交互 单个模型可以从多个表中提取数据吗 我相信 您可以创建一个工厂函数 该函数会以动态方式返回您的模型db table http
  • Magento - 没有新闻通讯订阅和取消订阅事件

    为什么在客户或新闻通讯模块中的新闻通讯订阅 取消订阅过程中或周围没有调度任何事件 我目前面临的唯一选择是使用订阅者模型的重写来适应这里的一些代码 有没有其他人有一个好的替代方案 或者我错过了什么 我遇到了需要监听订阅 取消订阅事件的情况 我
  • 将连续整数分组在一起

    有以下代码 import sys ints 1 2 3 4 5 6 8 9 10 11 14 34 14 35 16 18 39 10 29 30 14 26 64 27 48 65 ints sort ints list set ints
  • 代理设计模式的使用

    我试图理解代理设计模式 但我无法理解代理设计模式的用法 我从维基百科得到了这个代码示例 interface Image public void displayImage on System A class RealImage impleme
  • 编辑器中的 Unity 模糊和像素化精灵(无像素艺术)

    我目前正在 Unity 中制作一款类似移动三消游戏 我已经在 Inkscape 中以 256x256 制作了宝石 用于匹配的对象 的所有图形 并以 90 dpi 导出它们 PNG 文件 也尝试使用 360 但没有任何改变 我的问题是 当我在
  • 在 TPL 中返回空静态任务是一种不好的做法吗?

    在某些情况下 我想有条件地运行任务 我使用某种扩展方法 如下所示 public static class MyTaskExtension private static Task theEmptyTask Task Factory Start
  • 如何在 Laravel 5.5 中获取验证消息

    大家好 我正在开发 Laravel 5 5 在这里我需要显示我的 API 的验证消息 到目前为止我已经这样做了 validator Validator make request gt all first name gt email requ
  • grep 时间命令输出

    Using time ls 我有以下输出 time ls l total 2 rwx 1 FRIENDS None 97 Jun 23 08 59 location txt rw r r 1 FRIENDS None 10 Jun 23 0
  • JavaScript OOP 原型在构造函数之外?

    我正在阅读developer mozilla org 的 OOP JS 指南 并发现了以下代码片段 function Person gender this gender gender Person prototype gender Pers
  • 标签 在 Google 脚本中意味着什么?

    是否是标签Google 脚本的特定语法或者它可以在纯 html javascript 页面中工作吗 有没有相关的描述 这类似于PHP 标签 但当我看到这个时我怀疑 正式地 这些代码在 GAS 文档中被称为 scriptlet 它们是用于服务
  • 缓存 auth_request 中的令牌

    我想缓存请求标头字段授权中的令牌 Authorization Bearer abcdefghijklmnopqrstuvwxyz 我的目标是 我不必验证验证服务器上的每个请求 如果授权令牌已缓存 且有效 则请求应调用 API 而无需验证 l
  • 如何有效地逐行迭代“Vec>”?

    我正在写一个图书馆 它采用了Vec