C++ 相当于 Java Map getOrDefault?

C++ equivalent to Java Map getOrDefault?

Java 的 getOrDefault 是一个很好的构造,用于单行访问地图值或起点(如果地图值不存在)。我在 C++ 的地图参考中没有看到任何并行的东西。是否存在某些东西或者它是您自己构建的?

我在地图中有对象,如果它们存在我将更新它们,但如果它们不存在则构建新的。使用 getOrDefault,我可以在默认端构造对象,或者访问它(如果它存在)。

http://www.cplusplus.com/reference/map/map/

https://www.geeksforgeeks.org/hashmap-getordefaultkey-defaultvalue-method-in-java-with-examples/

I have objects in the map that I would update if they exist, but construct new if they do not. With getOrDefault, I could construct the object on the default side, or access it if it exists.

使用emplace.

auto& element = *map.emplace(key, value).first;
如果键不存在,

emplace 插入一个新元素,returns 一对包含元素(已插入或已存在)的迭代器和一个 bool 值指示是否发生插入。

也许我误解了你的意思,但这就是 map 的工作原理。

map<int, string> m;
string s = m[3];

会将 s 设置为默认构造的 string

当您使用 operator[] 在映射中查找键时,它总是会返回一个值。如果映射中不存在该键,它将使用默认构造值插入它。

如果您想要此行为,但具有不同的值(不是默认构造的值),则可以使用 emplace,如 L.F。已建议。

当我试图找出一种在 C++ 中使用 HashTable 解决 LeetCode 单数问题的方法时,我来到了这里。

方法 2 和 Java 中使用的 getOrDefault 没有直接替代方法,但我能够使用运算符 [] 访问 unordered_map 的元素。 参见 http://www.cplusplus.com/reference/unordered_map/unordered_map/operator[]/

如果键存在于映射中,则运算符[] 将return 对其映射值的引用。

如果键不存在,则运算符[]会将键添加到映射中,值为0。

当您尝试增加一个键的值(如果它已经存在)或向地图添加一个新键(如果它不存在)时,这可能会很有用。

比如我在C++中使用了下面的

for (int i : nums) { hash_table[i] = hash_table[i] + 1; }

这是 Java

中以下内容的替代方法

for (int i : nums) { hash_table.put(i, hash_table.getOrDefault(i, 0) + 1); }

  • Java

    map.put(sum, map.getOrDefault(value, 0) + 1);

  • c++ 中的等效代码

    auto it1 = map.find(value);
    if (it1 != um.end())
        map[value]++;
    else
        map[value] = 1;

我想下面就是你要找的东西

mymap.emplace(key, DEFAULT_VALUE).first->second = value;

就像在下面的示例中使用的那样

    #define DEFAULT_VALUE 0
    map<int,int> mymap;
    mymap[1] = 1;
    // mymap is having some entries.

    // will increment existing element.
    mymap.emplace(1,DEFAULT_VALUE).first->second++; 

    // will insert a new element with key 2 and value as default(0), than increment it.
    mymap.emplace(2,DEFAULT_VALUE).first->second++;