for loop-在C++中有条件地从1.n或n.1迭代
for loop - Iterating from 1..n or n..1 conditionally in C++
我有一个代码,看起来像这样:
bool var = some condition...
if( var )
{
for( int i=0; i<10; ++i )
{
//execute some code ...
}
}
else
{
for( int i=9; i>=0; --i )
{
//execute some other code...
}
}
然而,需要在for循环中执行的代码几乎完全相同,因此我不想写两次。我知道我可以做这样的事情:
bool var = some condition...
for( int i = (var ? 0 : 9 ); (var ? i<10 : i>=0 ); (var ? ++i : --i ) )
{
//Execute my code
}
但这是一个非常不优雅的解决方案。
有没有一种更简洁、更优雅的方法?我检查了std::迭代器,但我认为它不是我需要的。
您关注的是错误的问题。如果你有一个方向标志,不要对迭代变量的正确性感到困惑。只需根据需要进行解释:
for (int i = 0; i < n; ++i)
{
int j = var ? i : n - 1 - i;
// j goes from 0..n-1 or n-1..0
}
除非您正在执行数十亿次这样的调用,否则次要变量的开销将是微不足道的。
您只需将循环的主体分解为一个函数/方法,并传入足够的上下文即可进行操作。如果循环体主要使用this
上的字段,那么将其作为一个方法应该相当容易。否则,您不需要比循环当前拥有的参数更多的参数。
如果您使用的是C++11,您可以将其实现为捕获任何必要信息的lambda,并从每个循环中调用lambda(这样就不会有松散的函数)。不过,使用一个可以独立测试的函数或方法是个好主意。
循环中的代码是否依赖于迭代器的值?如果是,如何依赖?您可以巧妙地使用一些基本数学,比如将开始/结束转换为始终1..n,或者使用abs
和负数。这会给你留下一个循环,把身体移到一个函数中并不是绝对必要的。
希望尽量减少重复代码是明智的,但这并不意味着您的解决方案需要适合一行。只要用一种有意义和清晰的方式写出逻辑。包括评论来解释你在做什么以及为什么。
bool var = some condition...
int start = 0;
int end = 9;
int increment = 1;
if (!var)
{
// Reverse direction
start = 9;
end = 0;
increment = -1;
}
// Loop (forwards if var; reversed if !var)
for (int i = start; i != end; i += increment)
{
}
您可以使用类似的东西。
for(int j = 0; j < 10; ++j) { // always increases
int i = var ? j : 10 - 1 - j;
//go
}
这在我看来很像迭代,所以让我们试着写一个函数来帮助我们:
void incr(int& i) { ++i; }
void decr(int& i) { --i; }
template <typename Iter, typename Incr>
void do_work(Iter start, Iter finish, Incr incr)
{
for(Iter i = start, i != finish; incr(i))
{
// Do your code.
}
}
bool var = some condition...
if( var )
{
do_work(0, 10, &incr);
}
else
{
do_work(9, -1, &decr);
}
相关文章:
- 在C++中释放内存期间,迭代器与指针有何不同
- 提供运算符+或运算符到双向迭代器有什么缺点吗?
- 有没有一个迭代器的例子,它不会使用 ptrdiff_t 作为其difference_type?
- 具有迭代器和自定义步长的循环结束条件
- 连续迭代器有什么实际用途吗?
- 无法打印完整的二叉搜索树,因为我从最低节点向后迭代的逻辑有缺陷
- 对于C字符串,是否有一个标准的C++迭代器
- 有一个可迭代的容器,其中的成员在编译时是已知的
- 使用条件迭代器插入到向量中
- ActorItr 迭代器变量中有什么,* ActorItr 返回什么?
- 迭代器和标量对象之间的未定义行为有什么区别吗?
- 迭代器 for 循环不会确认循环完成条件
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 无法取消引用超出范围的向量迭代器 - 有什么问题?
- 有没有办法在C++中制作无锁"counter"随机访问迭代器?
- 是否有用于迭代向量的函数,而不管其类型如何?
- 有没有办法在不使用任何迭代的情况下将字符的字母顺序排列
- 有没有办法创建一个花哨的迭代器和相应的新数组,以便检查每个索引的索引值的条件?
- c++排序迭代有时会给出错误的值
- for loop-在C++中有条件地从1.n或n.1迭代