小编Cap*_*l C的帖子

std :: unordered_map :: merge()的安全性

在编写一些针对C++ 17的代码时,我遇到了一个障碍,它决定了合并两个兼容的std :: unordered_maps的操作的异常安全性.根据目前的工作草案 §26.2.7,表91部分内容涉及以下条件a.merge( a2 ):

要求: a.get_allocator() == a2.get_allocator().

尝试提取每个元素a2a使用哈希函数和密钥相等谓词将其插入a.在具有唯一键的容器中,如果键中的元素a与元素的键相等a2,则不会从中提取该元素a2.

后置条件:指针和对转移元素的a2引用引用那些相同的元素但作为成员a.引用传递元素的迭代器和引用的所有迭代器a都将失效,但剩余元素的迭代器a2将保持有效.

抛出:除非散列函数或键等式谓词抛出,否则无效.

值得注意的是,这些条件强烈地让人联想到普通关联容器(std :: map)的要求,如§26.2.6,表90所示a.merge( a2 ):

要求: a.get_allocator() == a2.get_allocator().

尝试提取每个元素a2a使用比较对象将其插入a.在具有唯一键的容器中,如果键中的元素a与元素的键相等a2,则不会从中提取该元素a2.

后置条件:指针和对转移元素的a2引用引用那些相同的元素但作为成员a.引用传递元素的迭代器将继续引用它们的元素,但它们现在表现为迭代器a,而不是a2.

抛出:除非比较对象抛出,否则无效.

我需要合并两个std :: unordered_maps和相同数量的元素,我可以确保这两个元素在两个容器中都是唯一的,这意味着包含合并结果的地图将使之前拥有的元素数量增加一倍,并且容器合并 …

c++ exception-safety c++17 gcc7

27
推荐指数
1
解决办法
746
查看次数

标签 统计

c++ ×1

c++17 ×1

exception-safety ×1

gcc7 ×1