如何清空boost::iterator_range?底层容器清空后迭代器失效问题
解决boost::iterator_range的“清空”问题
嘿,这个场景我太熟悉了!boost::iterator_range确实没提供现成的clear()方法,但咱们完全可以通过重置它的方式达到清空效果,解决你遇到的迭代器失效+empty()不生效的问题。
首先得说清楚为什么你试的p->begin() = p->end()没用:begin()和end()是返回迭代器的成员函数,你赋值的只是它们返回的临时迭代器,根本没修改iterator_range内部存储的迭代器对,所以empty()自然不会返回true。
下面给你两种靠谱的解决办法:
方法一:赋值空的iterator_range
直接把*p赋值为一个默认构造的空范围,这样它内部的迭代器就会被重置成空状态,empty()立刻返回true:
// 替换成你实际的vector迭代器类型,比如std::vector<int>::iterator using IterType = decltype(your_vector)::iterator; *p = boost::iterator_range<IterType>(); // 或者用更简洁的empty_range *p = boost::empty_range<IterType>();
方法二:重新绑定到底层vector的当前范围
既然你的底层vector已经被清空了,直接重新把iterator_range绑定到这个vector的begin()和end()(此时两者相等),也能得到空范围:
*p = boost::make_iterator_range(your_vector.begin(), your_vector.end());
这种方法的好处是,如果之后vector又被填充,你也可以用同样的方式更新iterator_range的范围。
最后要提醒一句:因为原来的迭代器已经失效了,一定要重置iterator_range的内部迭代器,不然后续对它的操作可能会触发未定义行为哦。
内容的提问来源于stack exchange,提问作者Sharu Gupta
相关产品推荐
相关产品推荐

