为什么 += 适用于没有值的 std::map 键?
Why does += work on std::map keys that don't have values?
我看到人们是如何解决这里提出的问题的:
给定一个由开始时间和结束时间组成的会议时间间隔数组[[s1,e1],[s2,e2],…][c];),找出所需会议室的最小数量。
解决方案之一是这样做:
#include <map>
#include <vector>
#include <algorithm>
using std::max;
using std::map;
using std::vector;
struct Interval {
int start;
int end;
Interval() : start(0), end(0) {}
Interval(int s, int e) : start(s), end(e) {}
};
int minMeetingRooms(vector<Interval>& intervals) {
map<int, int> changes;
for (auto i : intervals) {
changes[i.start] += 1;
changes[i.end] -= 1;
}
int rooms = 0, maxrooms = 0;
for (auto change : changes)
maxrooms = max(maxrooms, rooms += change.second);
return maxrooms;
}
每次新会议开始时增加计数器,每次会议结束时减少计数器,每次迭代取该计数器的最大值和上一个最大值。
我想知道的是map初始化的部分
for (auto i : intervals) {
changes[i.start] += 1;
changes[i.end] -= 1;
}
映射中的值从未被设置过,但是您仍然可以使用+=
操作符。我假设这会导致映射在那个地方创建一个0
,然后增加,但这是未定义的行为吗?是否每种类型都有默认值?例如,如果我有一个<int, string>
的地图,它会把什么作为默认值?它只是调用默认构造函数吗?
基本上我想知道的是std::map
的内部,它允许一个人添加到一个还不存在的键,以及它如何随类型而变化。
作为旁注:
如果我想写更习惯的代码,我会把
if (changes.find(i.start) == changes.end()) changes[i.start] = 0
if (changes.find(i.end) == changes.end()) changes[i.end] = 0
但我猜这是性能下降还是什么?
阅读文档:
返回一个值的引用,该值映射到与key等价的键,如果该键不存在则执行插入。
插入只使用键的默认构造函数,int
的默认构造函数产生0。
你的"更习惯"的代码是完全相反的习惯。当你想要自活时使用operator[]
,当你试图避免自活时使用count
/find
。
如果您有Python背景,这可能看起来有点落后,但这是惯用的c++。c++ std::map
的行为更像Python的defaultdict
而不是dict
;操作符查找自动激活,避免自动激活需要显式调用方法。
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 使用一个考虑到std::map中键值的滚动或换行的键
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- C++如何创建 std::map
- 从其他容器中移动构造"std::map"
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 使用重载 [] 运算符返回 std::map() 的可赋值
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- C++ 使用枚举类对象分配 std::map 值
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- std::map:当元素不可默认构造时创建/替换元素
- Arduino编译器和STL:使用std::vector和std::map