愚自少读书,有所得辄记之。其有不合,时复改定。或古人先我而有者,则遂削之——顾炎武
下面的代码,是quic代码中对已经确认收到的数据包,对其便宜量进行合并,比如收到对数据片(1500,3000)和(3000,4500)的ack,就可以合并为(1500,4500)。令我好奇的是这个函数竟然在while循环里同时有erase和insert操作。当然,要是这个intervals_是vector的类型,这么干肯定悲剧。
template <typename T>
void QuicIntervalSet<T>::Compact(const typename Set::iterator& begin,
const typename Set::iterator& end) {
if (begin == end)
return;
typename Set::iterator next = begin;
typename Set::iterator prev = begin;
typename Set::iterator it = begin;
++it;
++next;
while (it != end) {
++next;
if (prev->max() >= it->min()) {
// Overlapping / coalesced range; merge the two intervals.
T min = prev->min();
T max = std::max(prev->max(), it->max());
value_type i(min, max);
intervals_.erase(prev);
intervals_.erase(it);
std::pair<typename Set::iterator, bool> ins = intervals_.insert(i);
DCHECK(ins.second);
prev = ins.first;
} else {
prev = it;
}
it = next;
}
}
这就是stl中的容器中数据存储方式以及迭代器实现的不同,[1]有很好的说明。这种使用方式,只有遇见了,才会思考其差异,加深理解。记录在此。
[1] C++中迭代器原理、失效和简单实现 https://www.cnblogs.com/wxquare/p/4699429.html
[2] std::sort排序算法 https://blog.csdn.net/xijiacun/article/details/72902680