stl中迭代器的区别

愚自少读书,有所得辄记之。其有不合,时复改定。或古人先我而有者,则遂削之——顾炎武

 下面的代码,是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值