std :: map:当元素不是默认可构造的时,创建/替换元素

ples

假设您有一个默认不可构造的类。

class A {
  private:
    int a;
  public:
    A() = delete;
    A(int a0) : a(a0) {}
};

现在,我们有一些地图诠释- > A, std::map<int, A> mapping假设我们要为某个键0创建一个新的映射,如果键存在,我们要替换旧值。对默认可构造类执行此操作的方法是:

mapping[0] = A(4);

但是,这对于类A将失败,因为operator []首先构造A的默认实例,然后才分配A的值A(4)通常这样做的一种方法(例如,对于非默认可构造类)是:

auto it = mapping.find(0);
if (it == mapping.end()) {
  mapping.insert(0, A(4));
}
else {
  it->second = A(4);
}

我的问题是:这真的是(C ++)的预期方式吗?我觉得这是不对的。作为一名程序员,我不想花那么多代码就写那么多。但是似乎没有简单的出路:我已经查找了常见的地图方法(insert,emplace,emplace_hint),如果键已经存在,则所有这些方法均不执行任何操作。

YSC

我查找了常见的地图方法(插入,emplace,emplace_hint),如果键已经存在,则所有这些方法均不执行任何操作。

C ++ 17通过以下方式解决了这一点std::map::insert_or_assign

template <class M>
pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj);

如果密钥等同于k已在容器中存在,受让人std::forward<M>(obj)mapped_type对应于该键k如果键不存在,则插入新值,就像通过insert一样,从构造它value_type(k, std::forward<M>(obj)

这使得

auto it = mapping.find(0);
if (it == mapping.end()) {
  mapping.insert(0, A(4));
}
else {
  it->second = A(4);
}

好像

mapping.insert_or_assign(0, A(4));

完整程序演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 std::map 中插入非默认构造元素

来自分类Dev

普通的默认可构造std :: optional和std :: variant

来自分类Dev

在向std :: unordered_map插入元素时避免不必要的构造函数调用?

来自分类Dev

无法设置std :: map元素?

来自分类Dev

为构造的std :: vector中的每个元素调用默认构造函数

来自分类Dev

在 std::map 中优化创建新的空元素

来自分类Dev

std :: array中元素构造函数的参数

来自分类Dev

std :: array中元素构造函数的参数

来自分类Dev

如何从存储在std :: map中的std :: set中删除元素?

来自分类Dev

初始化std :: unordered_map的std :: list元素

来自分类Dev

std :: tuple带有move-constructable元素的默认构造函数

来自分类Dev

_Pairib': 不是 'std::map,std::allocator>> 的成员

来自分类Dev

std :: stod不是std的成员

来自分类Dev

std :: map可以移动包含的元素吗?

来自分类Dev

std :: map删除错误的元素

来自分类Dev

删除std :: vector <std :: string>中的元素

来自分类Dev

如果KEY是std :: list或std :: vector而不是值,则std :: map的默认行为是什么?

来自分类Dev

std :: sort无法排序std :: vector <std :: string>的元素

来自分类Dev

构造不同的元素时,'std :: allocator <T> :: construct'是线程安全的吗?

来自分类Dev

使用std :: vector时如何将索引信息传递给元素构造函数?

来自分类Dev

从std :: map通过元素数量获取子映射,而不是使用迭代器获取键

来自分类Dev

std :: vector元素的初始化移动/复制构造函数

来自分类Dev

为什么std :: vector的元素需要移动构造函数?

来自分类Dev

通过填充一个元素来构造std :: array

来自分类Dev

为什么std :: vector的元素需要移动构造函数?

来自分类Dev

std :: vector是否具有{元素的初始数量}构造函数?

来自分类Dev

通过代码构造 std::array 并初始化元素对象

来自分类Dev

std :: vector const元素更改

来自分类Dev

指向std :: vector元素的指针

Related 相关文章

  1. 1

    在 std::map 中插入非默认构造元素

  2. 2

    普通的默认可构造std :: optional和std :: variant

  3. 3

    在向std :: unordered_map插入元素时避免不必要的构造函数调用?

  4. 4

    无法设置std :: map元素?

  5. 5

    为构造的std :: vector中的每个元素调用默认构造函数

  6. 6

    在 std::map 中优化创建新的空元素

  7. 7

    std :: array中元素构造函数的参数

  8. 8

    std :: array中元素构造函数的参数

  9. 9

    如何从存储在std :: map中的std :: set中删除元素?

  10. 10

    初始化std :: unordered_map的std :: list元素

  11. 11

    std :: tuple带有move-constructable元素的默认构造函数

  12. 12

    _Pairib': 不是 'std::map,std::allocator>> 的成员

  13. 13

    std :: stod不是std的成员

  14. 14

    std :: map可以移动包含的元素吗?

  15. 15

    std :: map删除错误的元素

  16. 16

    删除std :: vector <std :: string>中的元素

  17. 17

    如果KEY是std :: list或std :: vector而不是值,则std :: map的默认行为是什么?

  18. 18

    std :: sort无法排序std :: vector <std :: string>的元素

  19. 19

    构造不同的元素时,'std :: allocator <T> :: construct'是线程安全的吗?

  20. 20

    使用std :: vector时如何将索引信息传递给元素构造函数?

  21. 21

    从std :: map通过元素数量获取子映射,而不是使用迭代器获取键

  22. 22

    std :: vector元素的初始化移动/复制构造函数

  23. 23

    为什么std :: vector的元素需要移动构造函数?

  24. 24

    通过填充一个元素来构造std :: array

  25. 25

    为什么std :: vector的元素需要移动构造函数?

  26. 26

    std :: vector是否具有{元素的初始数量}构造函数?

  27. 27

    通过代码构造 std::array 并初始化元素对象

  28. 28

    std :: vector const元素更改

  29. 29

    指向std :: vector元素的指针

热门标签

归档