-1

我想得到两个int元素的所有组合,比如 j 和 i,两者都不应该小于 3,这是我尝试过的:

for (int i =  10; i>=3;i--)
{
   for (int j = 23, j >= 3,j--) 
   {
       std::cout << " the i value " << i 
       << "the j value :" << j << std::endl; // since I'm using those combinations  
                                             // for the rest of my code I wrote 
                                             // this to keep things simple    
   }
}

他们无论如何都要在没有for循环的情况下这样做吗?

4

6 回答 6

4

这是正确的做法。

您可以使用其他循环,但逻辑始终保持不变。

于 2013-08-26T09:22:05.203 回答
1

您的方式无疑是最易读且易于维护的方式。

当然还有其他技巧,但这并不一定会让代码运行得更快。

例如,您可以简单地使用 1 级循环:

//assuming I am getting i [0..5), j [0..7)

for (int x = 0; x < 5*7 ; ++x) {
   cout << "i " << x/7 << " j " << x%7 << endl;
}

(有点像使用 1-demsion 数组进行多维数组的方式,但无论如何它并没有使代码更容易或更快。只是为了好玩......:P)

于 2013-08-26T09:37:04.520 回答
1

唯一值得尝试的合理变体是预先计算值,将它们放入静态数组,然后使用单个索引从那里访问它们。这仅在值的数量相当小的情况下才实用(如您的示例中所示),即使那样,也远不能确定它会加快速度。您获得了一个比较(因为您有一个循环,而不是嵌套循环),但该比较仅在外部循环中执行,并且内存访问,尤其是在现代机器上,可能会很昂贵。

您应该做的第一件事是分析您的代码。如果你对循环中的值做任何重要的事情,循环代码本身所花费的时间甚至都无法测量。不要试图优化不需要的东西。

于 2013-08-26T09:48:59.057 回答
1

如果你有一个整数列表,你可以把它们放在一个向量中并使用 `std::next_permutation' 来遍历可能的排列

http://en.cppreference.com/w/cpp/algorithm/next_permutation

于 2013-08-26T09:27:59.517 回答
0

我认为这是正确的做法。可能还有其他一些方法可以做到这一点,但这些方法的可读性可能会降低。如果您确实选择了不同的方法,那么请确保您计时,在没有可衡量的加速的情况下降低代码的可读性是不值得的。

于 2013-08-26T09:25:23.397 回答
0

您需要使用某种循环。你可以稍微优化一下:

  1. 使用和++i --i代替。它更容易操作,因为and返回新值,而不是旧值。i++i--i++i--

  2. 如果您想遍历二维数组并且迭代顺序无关紧要,最好先遍历j然后遍历i

    for(int j = 0; j < MAXJ; ++j){
        for(int i = 0; i < MAXI; ++i){
            do_sth_with(arr[i][j]);
        }
    }
    
  3. std:endl如果您只需要编写新行,请不要使用。std:endl强制冲洗,stdout所以它比"\n".

于 2013-08-26T09:33:32.577 回答