首页 > 解决方案 > 与 C++ std::map::insert 行为相比,C# SortedDictionary 效率

问题描述

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

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

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

标签: c#c++sorteddictionary

解决方案


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

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


推荐阅读