我如何从 Rust 的 Vec 中获取项目?

2024-05-02

我正在寻找一种方法consumes a Vec并返回一个元素,无需恢复的开销Vec的不变量的方式remove and swap_remove do:

fn take<T>(vec: Vec<T>, index: usize) -> Option<T>

但是,我找不到这样的方法。我错过了什么吗?这实际上不安全或不可能吗?

这是一个不同的问题内置*安全*方式来移出 Vec? https://stackoverflow.com/questions/37489004/built-in-safe-way-to-move-out-of-vect那里的目标是remove方法不会因越界访问而恐慌并返回Result。我正在寻找一种消耗的方法Vec并返回元素之一。上述问题的答案都没有解决我的问题。


你可以这样写你的函数:

fn take<T>(mut vec: Vec<T>, index: usize) -> Option<T> {
    if vec.get(index).is_none() {
        None
    } else {
        Some(vec.swap_remove(index))
    }
}

代码你see here (get and swap_remove) 保证为 O(1)。

However,有点隐藏,vec在函数末尾被删除,并且此删除操作可能不是 O(1),而是 O(n)(其中 n 是vec.len()). If T实施Drop, then drop()为向量内的每个元素调用,这意味着删除向量的时间复杂度为 O(n)。如果T不实施Drop,那么Vec只需要释放内存。的时间复杂度为dealloc操作取决于分配器并且没有指定,所以我们不能假设它是 O(1)。


提到使用迭代器的另一种解决方案:

fn take<T>(vec: Vec<T>, index: usize) -> Option<T> {
    vec.into_iter().nth(index)
}

While Iterator::nth()通常是一个线性时间操作,向量上的迭代器重写这个方法 https://doc.rust-lang.org/std/vec/struct.IntoIter.html#method.advance_by使其成为 O(1) 操作。当然,如果T实施Drop,这又是一个 O(n) 函数,因为需要删除 n 个元素。

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

我如何从 Rust 的 Vec 中获取项目? 的相关文章

随机推荐

  • 在 C# 中进行进程间通信 (IPC) 最简单的方法是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我有两个 C 应用程序 我希望其中一个向另一个发送两个整数 这不必很快 因为它每隔几秒调用一次 做到这一点最简单的方法是什么 它不一定是最优雅的
  • Python 记录到标准输出和日志文件

    我对 python 相当陌生 并开始进入日志记录模块 我希望将消息记录到日志文件中并输出到控制台 下面的代码将消息打印到控制台 但是如何将所有消息记录到文件中 Logger 对象没有用于记录到文件的函数调用 basicConfig file
  • apache solr:group by 产生的数据总和

    我们有一个要求 需要按特定字段对记录进行分组 并获取相应数字字段的总和 前任 select userid sum click count from user action group by userid 我们尝试使用 apache solr
  • 使用 Windows 身份验证的 User.Identity.Name

    我的标题中有一个非常简单的部分视图 称为 AccountInfoPanel 它只有一行 Welcome HttpContext Current User Identity Name 在我的 Web Config 中我有
  • Azure WebJobs - 我可以使用异步方法吗?

    我想知道Azure WebJobs SDK是否可以触发异步方法 目前我有一个如下所示的方法 class Program static void Main string args var host new JobHost host RunAn
  • 使用 Kotlin for Android 编写库有开销吗?

    我正在考虑将 Java Android 库移植到 Kotlin 我真的很喜欢 Kotlin 相对于 Java 的好处应该可以减少库中的错误数量 由于该库面向资源受限的环境 我担心将库移植到 Kotlin 会产生额外的开销 与 Java 库相
  • 为什么 C++ 中的 rand() 函数不是真正随机的

    我制作了非常简单的随机函数 并将结果保存在文件中 我使用该程序创建了两个不同的文件 并且它们中的信息完全相同 为什么会发生这种情况 这是我的简单程序 include
  • spring 类路径资源中的相对路径

    我有一堆 spring 配置文件 所有这些文件都位于各个子包的 META INF 目录下 我一直在使用如下所示的导入
  • 作为实例方法调用时行为不同的类方法?

    我想知道是否可以创建一个在作为类方法调用时与作为实例方法调用时表现不同的方法 例如 作为一个技能提高项目 我正在写一个Matrix类 是的 我知道已经有非常好的矩阵类 我为它创建了一个类方法 名为identity它返回指定大小的单位矩阵 现
  • 如何在表单中知道在用户控件中单击了哪个按钮[重复]

    这个问题在这里已经有答案了 我有一个 Windows 窗体和一个用户控件 用户控件具有三个按钮 我想知道我的用户控件的哪些按钮已被单击 我需要获取单击的按钮的名称 以启动特定的过程 在表格1中 if User Control1 Button
  • 用于发布 APIM 开发人员门户的 Powershell 脚本[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 I am planning to publish the developer portal using powershe
  • 在什么情况下使用html 5的
    标签来代替

    你在什么场景下使用 section html 5 的标签 代替 div 章节的示例包括章节 选项卡式对话框中的各个选项卡式页面或论文的编号部分 网站的主页可以分为介绍 新闻和联系信息几个部分 部分元素表示通用文档或应用程序部分 部分元素不是
  • REDIRECT URIS OAuth 2.0 是否有命名标准?

    我只想知道 REDIRECT URIS 是否有命名标准 Twitter LinkedIn Microsoft Facebook 和 Google 何时使用 OAuth 2 0 因为 如果我这样写我的域名 http domain com ac
  • 从heroku 中删除“server”和“via”标头?

    当我向本地服务器发送请求时 这是我的响应标头 Connection close Content Length 7 Content Type application json charset utf 8 Date Thu 27 Aug 201
  • 随机化节点顺序 xslt

    我有一个包含如下节点的 XML 文件
  • 调用 new SqlConnection() 会挂起程序

    这个把我难住了 我什至没有尝试连接到数据库 当这段代码到达我实例化一个新的 SqlConnection 对象的行时 它只是挂在那里 不会抛出异常或任何东西 我已经尝试将其编译为2 0 3 5和4 0 它们都挂了 当然 它也适用于我的机器和你
  • 为什么我的 git 预提交钩子不修剪行尾的空白?

    我在 Mac Mojave 上 我在 git templates hooks pre commit 创建了一个文件 我想删除我正在提交的文件行尾的空格 我希望这种情况在全球范围内发生在我的所有项目中 A git hook script to
  • 有没有办法为数据表绘制UMAP或t-SNE图?

    我有一个巨大的文件 下面是一小部分数据 如下所示 我想绘制一个 PCA 我可以使用 PCA 函数绘制 PCA 但它看起来有点乱 因为我有 200 列 所以我想也许 t SNE 或 UMAP 效果更好 但我无法使用它们进行绘图 我想在图中显示
  • Python GTK 信号处理程序不工作

    我正在使用 GTK 为 GUI 编写一个 Python 应用程序 我注意到从终端使用 Ctrl C 关闭它不起作用 我发现这是因为一个错误 所以我尝试手动处理该信号 问题是 如果我将默认行为设置为默认行为 则会捕获信号并正确关闭应用程序 但
  • 我如何从 Rust 的 Vec 中获取项目?

    我正在寻找一种方法consumes a Vec并返回一个元素 无需恢复的开销Vec的不变量的方式remove and swap remove do fn take