【发布时间】: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/1942 和 github.com/dotnet/corefx/issues/31126 和
-
来自ConcurrentDictionary 的AddOrUpdate 可以做到我不知道的性能。
标签: c# c++ sorteddictionary