C++ 在两个范围内循环的更好方法是什么?将它们相乘并循环一次,或者分别在每个范围内循环?

C++ 在两个范围内循环的更好方法是什么?将它们相乘并循环一次,或者分别在每个范围内循环?,c++,c,loops,C++,C,Loops,我无法决定如何在范围内循环。这样: for (int i = 0; i < max_i; i++) { for (int j = 0; j < max_j; j++) { // first way - two loops } } for(int i=0;i

我无法决定如何在范围内循环。这样:

for (int i = 0; i < max_i; i++) {
    for (int j = 0; j < max_j; j++) {
        // first way - two loops
    }
}
for(int i=0;i
或者这样:

for (int k = 0; k < max_i*max_j; k++) {
    // second way - one loop
}
for(int k=0;k

谢谢,Boda Cydo。

取决于你在循环中做了什么。你需要指数i和j吗?那么我更喜欢第一种解决方案。

取决于您在循环中所做的工作。你需要指数i和j吗?那么我更喜欢第一种解决方案。

这要看情况而定。 如果您想要单独的索引,那么可以使用第一个索引。 如果您只需要一个单一索引,则需要第二个索引

这两个循环的复杂性是相同的。

这取决于具体情况。 如果您想要单独的索引,那么可以使用第一个索引。 如果您只需要一个单一索引,则需要第二个索引


两个循环的复杂性是相同的。

如果您决定使用第一种方法,那么一切都很好,因为您同时拥有
i
j
的值。第二种方法是,您必须手动获取
i
j
的值:

for (int k = 0; k < max_i*max_j; k++) {
    i = k / max_j;
    j = k % max_j;
    ....
}
for(int k=0;k

因此,在您的情况下,第一种方法肯定更好。

如果您决定使用第一种方法,那么一切都很好,因为您同时具有
i
j
的值。第二种方法是,您必须手动获取
i
j
的值:

for (int k = 0; k < max_i*max_j; k++) {
    i = k / max_j;
    j = k % max_j;
    ....
}
for(int k=0;k

因此,对于您的情况,第一种方法肯定更好。

这取决于您将如何处理索引。如果分别使用两个值(例如,在两个循环中迭代所有值的排列),则两个循环的解决方案更清晰。如果您不关心单个值,而只关心它们的产品,那么单循环策略会更好


无论哪种方式,都要选择能更清楚地表达你意图的策略。与维护代码的简单性的重要性相比,性能影响微不足道。

这取决于您将如何使用索引。如果分别使用两个值(例如,在两个循环中迭代所有值的排列),则两个循环的解决方案更清晰。如果您不关心单个值,而只关心它们的产品,那么单循环策略会更好


无论哪种方式,都要选择能更清楚地表达你意图的策略。与维护代码的简单性的重要性相比,性能影响微不足道。

如果使用2D数组,第一个数组的可读性要高得多。在过去,用1D模拟2d阵列在某种程度上是很常见的,但在本例中,第一个阵列更具可读性

如果使用2D数组,则第一个数组的可读性要高得多。在过去,用1D模拟2d阵列在某种程度上是很常见的,但在本例中,第一个阵列更具可读性

显然,如果您有选择权,在循环过程中不需要精确的i和j值

因此,第二个选项更好,可读性更强(缩进更少)。您可以进行一些优化(以避免在每次循环迭代中进行乘法):

int-iKMax=max\u i*max\u j;
对于(int k=0;k

并且总是在循环(++k)中使用前缀操作符,因为无论对象迭代什么,它都会保存该对象的一个副本。(C++编码标准:101个规则、指南和最佳实践由Habor萨特和Andrei Alexandrescu)

< P>显然,如果你有选择,你不需要在循环中精确地定义I和J。 因此,第二个选项更好,可读性更强(缩进更少)。您可以进行一些优化(以避免在每次循环迭代中进行乘法):

int-iKMax=max\u i*max\u j;
对于(int k=0;k

并且总是在循环(++k)中使用前缀操作符,因为无论对象迭代什么,它都会保存该对象的一个副本。(参见C++编码标准:Habor萨特和Andrei Alexandrescu的101条规则、准则和最佳实践)

< P> >当代码> Max I I/<代码>或/和 Max Sj> <代码>时,不能使用第二个变体。请注意,
int
是有符号类型。如果
sizeof(int)
等于4字节,那么在
max_i=32768
max_j=65536
的情况下,循环将执行零次


如果没有特殊要求,我更喜欢第一个变量,因为它更可读。

max\u I
或/和
max\u j
足够大时,不能使用第二个变量。请注意,
int
是有符号类型。如果
sizeof(int)
等于4字节,那么在
max_i=32768
max_j=65536
的情况下,循环将执行零次


如果没有特殊要求,我更喜欢第一个变量,因为它更可读。

第一个循环更好,至少有两个原因:

  • 它可以使读者清楚地了解循环的嵌套性质(取决于需要什么)
  • 如果max_i*max_j在第二个备选方案中溢出,会发生什么情况

  • 另外,请探讨循环索引变量是“int”还是“size\t”。大小\u t保证始终为正

    第一个循环更好,至少有两个原因:

  • 它可以使读者清楚地了解循环的嵌套性质(取决于需要什么)
  • 如果max_i*max_j在第二个备选方案中溢出,会发生什么情况