防止迭代器越过容器的末端

时间:2019-02-24 23:23:59

标签: debugging iterator containers c++17 assertion

我正在使用一些整数timedelta来开发自己的for_each类型的函数。

这是我当前的功能:

N

我对内部if语句的最后一次尝试是这样的:

template<typename Container, typename Function>
void for_each_by_n( Container&& cont, Function f, unsigned increment_by ) {
    using std::begin;
    auto it = begin(cont);

    using std::end;
    auto end_it = end(cont);

    while ( it != end_it ) { // traverse the full container
        f(*it);  // call the function pointer - object etc.
        for ( unsigned n = 0; n < increment_by; ++n ) {
            // here I want to increment the pointer as long as the next iteration of
            // increment_by is within the bounds of the range of the container
            if ( .... tried many things .... ) return; // and or break;
            ++it;
        }
    }
}

但是,我不断收到调试断言失败,我无法迭代超过容器索引的末尾。这让我很困惑,我也不知道如何防止迭代越过结束。

2 个答案:

答案 0 :(得分:1)

好的,我离开计算机约30秒钟到一分钟,然后它传到我身上。我完全想不通了,这实际上是一个简单的解决方法。

对于if语句,我要做的就是这样:

if ( it == end_it ) return;

现在它可以正常工作了。无需根据索引指针与末尾的比较位置进行计算。我要做的就是比较它们是否相等,如果相等,就返回。

因此完整功能现在看起来像这样:

// positive direction from begin to end only
template<typename Container, typename Function>
void for_each_by_n(Container&& cont, Function f, unsigned increment_by) {
    using std::begin;
    auto it = begin(cont);

    using std::end;
    auto end_it = end(cont);

    while (it != end_it ) {
        f(*it);
        for ( unsigned n = 0; n < increment_by; ++n ) {
            if (it == end_it) {
                return;
            }
            ++it;
        }
    }
}

肯定是coders_block综合征...

答案 1 :(得分:0)

这里的关键是要意识到您想要cont的每个块的第一个元素,而每个块都是increment_by的元素。因此,有cont.size()/increment_by个块。无需检查您是否到达了最后一个迭代器,只需计算大块即可。

不需要++it。使用std::advance(increment_by),对于随机访问迭代器,它要快得多。