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++;
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++;