与C ++ std :: map :: insert行为相比,C#SortedDictionary的效率

时间:2018-07-26 14:12:36

标签: c# c++ sorteddictionary

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

本质上:我想尝试添加新的键和值对,或者如果已经存在匹配的键,则获取其关联值并对其进行操作,会引起潜在的(主观上) )遍历2个容器的大量成本,这在C ++中是很简单的事情?

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

1 个答案:

答案 0 :(得分:0)

为了他人的利益,缺乏答案使我得出结论,这与“尝试在地图中插入新的键值,但是如果键已经在其中,告诉我并给出我认为现有的键和值”操作类似于std :: map :: insert 用于标准字典或c#中的SortedDictionary 。这似乎是对这些容器设计的疏忽。

但是,请在上面的评论中使用@DragandDrop来回答ConcurrentDictionary的“ AddOrUpdate”或“ GetOrAdd”,这将允许所请求的行为在单个遍历中进行(尽管很明显,这需要额外的锁定机制开销,视用途而定,可能超过常规Dictionary / SortedDictionary容器的两次遍历。