【问题标题】:C# SortedDictionary efficiency in comparison to C++ std::map::insert behaviour与 C++ std::map::insert 行为相比,C# SortedDictionary 效率
【发布时间】:2018-07-26 14:12:36
【问题描述】:

是否存在与 C++ 的 std::map::insert 等效的方法,但对于 C# SortedDictionary(或类似容器),它也指示插入成功或失败,并且如果插入失败,它还提供对现有键值对的访问?

本质上:我想尝试添加一个新的键值对,或者如果匹配的键已经存在,获取它的关联值并对它做一些事情,不会产生潜在的(主观上) 2 批容器遍历的高额成本,这在 C++ 中是微不足道的?

据我所知,我可以尝试添加一个新的键值对(它必须对容器进行一定量的遍历)。如果它失败了,我必须捕获一个表明密钥已经存在的异常,然后我必须找到现有的 k-v 对(可能是容器的另一个遍历)来获取我现在可以修改的关联值。或者,我可以首先搜索密钥是否存在(一次遍历)。如果没有,那么我想添加一个新的 k-v 对(这很可能涉及很多相同的遍历工作)。无论哪种方式,最坏的情况是 2 次潜在的昂贵遍历,而 C++ 的 std::map::insert 提供了一种有效的机制来实现我想要的,只使用 1 次遍历。

【问题讨论】:

  • 那么你的问题是什么?好像你已经得到了答案。
  • “潜在的高成本” 遍历一个平衡的搜索树一次不会是高昂的。虽然在可能的情况下避免即使是很小的成本也很好,但至少重要的是要了解什么是昂贵的,什么实际上并不昂贵。
  • 记住,如果你真的需要,你可以从微软的Github上获取SortedDictionary<,>的源码并修改。它是根据 MIT 许可证分发的,这是最宽松的许可证之一。
  • 并查看 github 上关于类似论点的这些问题:github.com/dotnet/corefx/issues/1942github.com/dotnet/corefx/issues/31126
  • 来自ConcurrentDictionary 的AddOrUpdate 可以做到我不知道的性能。

标签: c# c++ sorteddictionary


【解决方案1】:

为了其他人的利益,缺乏答案让我得出结论,没有等同于好的“尝试将新的键值插入映射,但如果键已经在其中,请告诉我并给出我现有的键和值”操作,如 std::map::insert 用于标准字典或 C# 中的 SortedDictionary。这似乎是这些容器设计的疏忽。

但是,感谢上面 cmets 中的 @DragandDrop 的答案,即存在 ConcurrentDictionary 的“AddOrUpdate”或“GetOrAdd”,这将允许在一次遍历中请求的行为(尽管显然有额外的锁定机制开销,其中,根据使用情况,可能会超过常规 Dictionary/SortedDictionary 容器的双重遍历。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多