在for循环中获得所有组合的最快方法是什么
what is the fastest way to get all combinations in a for loop
我想得到两个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循环的情况下这样做吗?
这是正确的方法。
您可以使用其他循环,但逻辑始终保持不变。
关于唯一值得尝试的合理变体是预先计算值,将它们放入一个静态数组中,并使用单个索引从那里访问它们。只有当值的数量相当小(如您的示例中所示),即使如此确信它会把事情说清楚。您获得了一个比较(因为您有一个单独的循环,而不是嵌套的循环),但这种比较仅在外循环中执行,并且内存访问,尤其是在现代机器,可能很昂贵。
您应该做的第一件事是评测您的代码。如果你在做循环中值的任何重要内容,所花费的时间循环代码本身甚至无法测量。不要尝试优化一些不需要它的东西。
您的方法无疑是最可读、最易于维护的方法。
当然,还有其他技巧,但没有必要让代码运行得更快。
例如,您可以简单地使用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;
}
(有点像一维数组用于多维数组的方式,但无论如何,它并没有使代码变得更容易或更快。只是为了好玩…:p)
如果你有一个整数列表,你可以把它们放在一个向量中,并使用"std::next_placement"迭代可能的排列
http://en.cppreference.com/w/cpp/algorithm/next_permutation
我认为这是正确的方法。可能还有其他方法,但这些方法可能可读性较差。如果你选择了一种不同的方法,那么一定要计时,在没有可衡量的加速的情况下降低代码的可读性是不值得的
您需要使用某种循环。你可以稍微优化一下:
-
使用
++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
。CCD_ 11强制刷新CCD_ 12,因此它比CCD_ 13慢。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在 std::visit 中跳过变体类型的一些重载组合的方法是什么?
- 将8 UINT8_T组合到单个UINTMAX_T中的最快方法是什么?
- 从给定的 IPv6:端口列表中搜索 IPv6:端口组合的最快搜索算法是什么 O(1) 时间一致性
- 以下语法与擦除和删除的组合是什么意思
- 设计生成所有 n 位数字组合的递归函数的最佳方法是什么?
- 在for循环中获得所有组合的最快方法是什么
- 在C++中生成组合列表的最简单方法是什么?