仅当使用rust在地图中不存在新对象时,才如何将其插入地图?

近藤孝敏

我正在将C ++代码传输到rust。这是原始的C ++代码。

#include <map>
#include <string>
#include <cassert>
#include <iostream>

int main() {
    std::map<std::string, int> m {
        { "A", 1 },
        { "B", 2 },
        { "D", 4 },
    };
    // *1
    auto r = m.equal_range("C"); // *2
    if (r.first == r.second) {
        auto const& it = r.first;
        assert(it->first == "D");
        assert(it->second == 4);
        // Let's say creating the object to insert is high cost
        // so it should be created only if the element doesn't exist.
        // Creating the object at *1 is not acceptable because if the element exists,
        // then the created object isn't userd.
        //
        // `it` is hint iterator that point to insertion position.
        // If the object to isnert has the same key as the argument of equal_range (*2)
        // the time complexity is O(1).
        m.emplace_hint(it, "C", 3); 
    }
    for (auto const& kv : m) {
        std::cout << kv.first << ":" << kv.second << std::endl;
    }
}

可运行的演示:https : //wandbox.org/permlink/4eEZ2jY9kaOK9ru0

如果不存在,则正在插入。

我要存档两个目标。

一种是有效地插入对象。搜索对象的时间复杂度为O(logN)。我只想在地图中不存在该对象时插入新对象。如果从头开始插入新对象,则需要O(logN)额外费用来搜索插入位置。原始的C ++代码it用作插入新对象的提示。

另一种是仅在映射中不存在具有相同键的对象时创建新对象。因为在实际情况下创建对象需要很高的成本。(我的示例代码用户std :: string和int值。这只是一个示例。)因此,我不想预先创建要插入* 1的对象。

我阅读了BTreeMap文档。但是我找不到路。

https://doc.rust-lang.org/std/collections/struct.BTreeMap.html

有什么好办法吗?还是有任何非标准容器(地图)支持我要执行的操作?

马斯林

看起来您想要Entry API?

在示例中,m.entry("C")将返回一个Entry枚举,其中包含有关该条目是否存在的信息。然后,您可以显式分派或使用一种高级方法,例如BTreeMap::or_insert_with,该方法采用一个函数(并因此创建要延迟插入的对象)

因此,Rust版本将类似于以下内容:

let mut m = BTreeMap::new();
m.insert("A", 1);
m.insert("B", 2);
m.insert("D", 4);

m.entry("C").or_insert_with(|| {
    3 // create expensive object here
});

for (k, v) in &m {
    println!("{}:{}", k, v);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

地图中不存在的默认值

来自分类Dev

仅当fb_id不存在时才插入-否则不执行任何操作-PHP

来自分类Dev

仅当值不存在时才返回行

来自分类Dev

仅当不存在MongoDB文档字段时,才如何更新它们?

来自分类Dev

CSVHelper说不存在地图

来自分类Dev

如何匹配功能头中地图的不存在键

来自分类Dev

仅当数组元素不存在时如何将其插入数据库

来自分类Dev

仅当值不存在时才从SELECT插入表中

来自分类Dev

仅当队列中不存在项目时才将其添加到队列中

来自分类Dev

SQL查询-插入,但仅当记录不存在时才插入?

来自分类Dev

在Amazon Redshift中,如何仅在行不存在时才批量插入行?

来自分类Dev

仅当前缀不存在时,如何才将前缀添加到列表项?

来自分类Dev

仅当id不存在时才插入数据库

来自分类Dev

密钥不存在时地图出现问题

来自分类Dev

仅当使用MySQL的值不存在时才如何从表中插入值?

来自分类Dev

仅当不存在记录时,才通过存储过程从TVP列表中插入项目-性能降低

来自分类Dev

仅当不存在较新的记录时才选择一条记录

来自分类Dev

仅当一个表中的数据不存在时才将其插入

来自分类Dev

SQL-仅当B不存在时才选择A

来自分类Dev

Scala检查地图中是否不存在

来自分类Dev

仅当不存在时才插入MySQL,否则什么也不做

来自分类Dev

SQL查询-插入,但仅当记录不存在时才插入?

来自分类Dev

仅当记录不存在时才插入表

来自分类Dev

仅当 oracle sql 中不存在值时才插入

来自分类Dev

如何在不存在的路径上更新嵌套地图

来自分类Dev

如何使用 OpenCV python 检测不存在的新对象?

来自分类Dev

仅当新的 providerId 不存在时才更新 MongoDB 字段值

来自分类Dev

仅在新数据不存在时插入新数据

来自分类Dev

仅当不存在而未获取其 id 时才插入一行

Related 相关文章

  1. 1

    地图中不存在的默认值

  2. 2

    仅当fb_id不存在时才插入-否则不执行任何操作-PHP

  3. 3

    仅当值不存在时才返回行

  4. 4

    仅当不存在MongoDB文档字段时,才如何更新它们?

  5. 5

    CSVHelper说不存在地图

  6. 6

    如何匹配功能头中地图的不存在键

  7. 7

    仅当数组元素不存在时如何将其插入数据库

  8. 8

    仅当值不存在时才从SELECT插入表中

  9. 9

    仅当队列中不存在项目时才将其添加到队列中

  10. 10

    SQL查询-插入,但仅当记录不存在时才插入?

  11. 11

    在Amazon Redshift中,如何仅在行不存在时才批量插入行?

  12. 12

    仅当前缀不存在时,如何才将前缀添加到列表项?

  13. 13

    仅当id不存在时才插入数据库

  14. 14

    密钥不存在时地图出现问题

  15. 15

    仅当使用MySQL的值不存在时才如何从表中插入值?

  16. 16

    仅当不存在记录时,才通过存储过程从TVP列表中插入项目-性能降低

  17. 17

    仅当不存在较新的记录时才选择一条记录

  18. 18

    仅当一个表中的数据不存在时才将其插入

  19. 19

    SQL-仅当B不存在时才选择A

  20. 20

    Scala检查地图中是否不存在

  21. 21

    仅当不存在时才插入MySQL,否则什么也不做

  22. 22

    SQL查询-插入,但仅当记录不存在时才插入?

  23. 23

    仅当记录不存在时才插入表

  24. 24

    仅当 oracle sql 中不存在值时才插入

  25. 25

    如何在不存在的路径上更新嵌套地图

  26. 26

    如何使用 OpenCV python 检测不存在的新对象?

  27. 27

    仅当新的 providerId 不存在时才更新 MongoDB 字段值

  28. 28

    仅在新数据不存在时插入新数据

  29. 29

    仅当不存在而未获取其 id 时才插入一行

热门标签

归档