我希望得到两个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循环的情况下执行此操作?
答案 0 :(得分:4)
这是正确的做法。
您可以使用其他循环,但逻辑始终保持不变。
答案 1 :(得分:1)
如果你有一个整数列表,你可以将它们放在一个向量中并使用`std :: next_permutation'迭代可能的排列
答案 2 :(得分: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)
答案 3 :(得分:1)
关于唯一值得尝试的合理变体是预先计算 将值放入静态数组中,并使用单个索引 从那里访问它们。这仅在值的数量时才是实用的 相当小(如你的例子),即便如此,它还远非如此 确定它会说明问题。你得到一个比较(因为 你有一个循环,而不是嵌套循环),但这种比较 只在外循环和内存访问中执行,特别是在a 现代机器,可能很贵。
您应该做的第一件事是分析您的代码。如果你在做 与循环中的值有关的任何重要事项,它所需的时间 循环代码本身甚至不可测量。不要试图优化 不需要它的东西。
答案 4 :(得分:0)
我认为这是正确的做法。可能还有其他一些方法可以做到,但那些可能性较差。如果你确实选择了不同的方法,那么请确保你计时,在没有可测量的加速的情况下降低代码的可读性是不值得的。
答案 5 :(得分:0)
你需要使用某种循环。你可以稍微优化一下:
使用++i
--i
代替i++
和i--
。操作更简单,因为i++
和i--
会返回新值,而不是旧值。
如果你想迭代二维数组并且迭代次序无关紧要,最好先通过j
然后通过i
进行迭代:
for(int j = 0; j < MAXJ; ++j){
for(int i = 0; i < MAXI; ++i){
do_sth_with(arr[i][j]);
}
}
如果您只需要写新行,请不要使用std:endl
。 std:endl
强制在stdout
上强制使其慢于"\n"
。