【发布时间】:2017-03-16 13:23:40
【问题描述】:
我在看人家解决问题的方法here:
给定一个由开始和结束时间组成的会议时间间隔数组 [[s1,e1],[s2,e2],...] (si
其中一个解决方案是执行以下操作:
#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;
}
每次新会议开始时增加一个计数器,每次会议结束时减少一个计数器,取该计数器的最大值和每次迭代的前一个最大值。
我很好奇的是地图初始化的部分
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
但我猜这是性能下降还是什么?
【问题讨论】:
标签: c++ c++11 dictionary stl