我正在使用一些整数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;
}
}
}
但是,我不断收到调试断言失败,我无法迭代超过容器索引的末尾。这让我很困惑,我也不知道如何防止迭代越过结束。
答案 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)
,对于随机访问迭代器,它要快得多。