如何解决如何可靠地“钳位”迭代器?
我正在遍历一个向量,如下所示:
for(auto it = myVector.begin(); it != myVector.end(); ++it){
// Do some stuff
}
在循环中,根据某些条件,我向迭代器添加了一个变量,以便“跳转”(但重要的是,永远不要“移回”)。什么是“钳制”迭代器的“正确”方法(或者至少是一种有效/可靠的方法),以使我最终不会超出向量的末尾(最终会导致程序崩溃或,更糟糕的是,行为还不确定)?
解决方法
if (myVector.end() - it < variable_amount)
it += variable_amount;
else
break;
使用std::distance
和std::advance
可以使其与非随机访问迭代器一起使用,但这对他们来说是一种低效的算法,所以我建议不要使用它们。
非随机访问迭代器的算法:
for (; variable_amount-- && it != myList.end(); ++it);
,
您可以制作自己的advance
版本,该版本永远不会超出最终迭代器的范围。改编自https://en.cppreference.com/w/cpp/iterator/advance
// Assumes c++11 at least
template<class It,class Distance>
constexpr void clamped_advance(It& it,It limit,Distance n) {
using category = typename std::iterator_traits<It>::iterator_category;
static_assert(std::is_base_of<std::input_iterator_tag,category>::value,"Cannot advance non-input iterator");
auto dist = typename std::iterator_traits<It>::difference_type(n);
assert(("Can only clamped_advance forward",dist >= 0));
if (std::is_base_of<std::random_access_iterator_tag,category>::value)
std::advance(it,std::min(dist,std::distance(it,limit)));
else
while (dist-- > 0 && it != limit) ++it;
}
您可以像这样使用它:
for (auto it = myVector.begin(); it != myVector.end(); ++it) {
// Do some stuff
// If this was going to advance past the end,`it` would equal `myVector.end()`
// and the loop will stop
clamped_advance(it,myVector.end(),variableAmount);
}
,
我将从当前迭代器和begin
迭代器之间的getting the distance开始。
如果该距离加上偏移量大于矢量大小,那么您将超出范围。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。