【问题标题】:Changing Assigned Value for STL Map [duplicate]更改 STL 映射的分配值 [重复]
【发布时间】:2014-03-05 12:46:20
【问题描述】:

当我创建一个std::map 时,所有索引最初都没有指向任何地方。我一打电话给他们,他们就分配并分配了值 0。

例如:

map <int, int> x;
cout << x.[31233];

输出是0

但是,我需要将所有标准赋值为 (-1) 而不是 0

我该如何更改?

【问题讨论】:

  • 无论如何,您都不能不使用像int 这样的标准类型来处理数据。您可以创建一个可以隐式转换为int 的类,并且其构造函数在构造时将值设置为-1
  • 欢迎来到 Stack Overflow。 “谢谢”和“你好”通常在这里被省略,都是关于原始问题的。
  • std::map&lt;&gt;::operator[] 自动插入并初始化键的值(如果它不存在于映射中)。 (并且int() 为零)。如果您想要不同的东西,您可能需要 find(key) 键,如果生成的迭代器是 x.end()insert 它的值是 (-1)。
  • @JoachimPileborg 好吧,理论上你可以编写一个自定义分配器,初始化为-1.. 但是你为什么要这样做;)
  • @lethal-guitar 因为你可以? =P

标签: c++ map stl


【解决方案1】:

在这个定义之后

map <int, int> x;

地图没有元素。要添加具有键 31233 和值 -1 的元素,您可以编写

x[31233] = -1;

您不能这样做,因为根据 C++ 标准相对于下标运算符,默认值为 -1

如果映射中没有与 x 等效的键,则将 value_type(x, T()) 插入映射中

对于intint()类型,零初始化对应的对象。

否则,您应该使用一些insert 方法来显式指定初始值。

【讨论】:

    【解决方案2】:

    给定一个std::map&lt;key_type, value_type&gt;,通过operator [](cont key_type&amp;) 查找任意键将自动插入value_type() 用于表示键(如果它不存在)。在您的情况下,value_typeintint() 是零初始化的,因此结果为零。

    如果您想使用不同的默认构造,您可以选择,其中最极端的方法是为 int 编写一个自定义分配器,并为我们编写一个 construct 成员 -1 用于 int 值类型(呸)。我认为您可能会发现更简单:

    std::map <int, int> x;
    
    // load map with values...
    
    int res = -1;
    auto it = x.find(31233);
    if (it != x.end())
        res = x.second;
    
    // use res here.
    

    【讨论】:

    • 分配器不起作用:见this comment
    • @interjay 我发誓我已经做到了,但我这样做可能违反了规则。一个可以做一些非常可怕的事情,只需旋转一个Integer 类,其中包含大量重载和(-1)而不是0 的默认构造,然后将int 映射到Integer。谈论恶心。
    【解决方案3】:

    当您打算插入一个新值时,您应该停止使用operator[],而改为使用insert()。如果您想为从未插入的内容设置“默认”值,最好编写自己的容器,该容器在内部使用地图并公开诸如 get() 方法之类的东西,该方法从地图中返回存储的值或-1 如果没有找到。这样可以避免存储大量不需要的 -1 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 2011-05-29
      • 2021-07-21
      相关资源
      最近更新 更多