gpt4 book ai didi

c++ - 无论方向如何,从一个整数循环到另一个整数,开销最小

转载 作者:太空狗 更新时间:2023-10-29 23:28:18 25 4
gpt4 key购买 nike

假设我有两个无符号整数:

size_t A, B;

它们加载了一些随机数,A 可能大于、等于或小于 B。我想从 A 循环到 B。但是,比较和递增都取决于哪个更大。

for (size_t i = A; i <= B; ++i) //A <= B
for (size_t i = A; i >= B; --i) //A >= B

显而易见的暴力解决方案是将这些嵌入到 if 语句中:

if (A <= B)
{
for (size_t i = A; i <= B; ++i) ...
}
else
{
for (size_t i = A; i >= B; --i) ...
}

请注意,我必须从 A B 循环,所以我不能有两个中间整数并将 A 和 B 扔到正确的位置然后进行相同的比较和递增。在“A 更大”的情况下 I 必须递减,反之必须递增。

我可能会有很多需要相同设置的嵌套循环,这意味着每个 if/else 都会有一个函数调用,我必须通过它传递很多变量,或者另一个 if/else 和另一个 if/其他等等

是否有任何巧妙的捷径可以在不牺牲太多速度的情况下避免这种情况?函数指针和紧密的、经常重复的循环中的东西对我来说听起来非常痛苦。是否有一些疯狂的模板解决方案?

最佳答案

我的错误,最初误解了问题。

要创建从 AB 的包含循环,您会遇到一个棘手的情况。您需要循环一个过去 B。因此您在循环之前计算出该值。我在 for 循环中使用了逗号运算符,但为了清晰起见,您始终可以将其放在外面。

int direction = (A < B) ? 1 : -1;
for( size_t i = A, iEnd = B+direction; i != iEnd; i += direction ) {
...
}

如果你不介意修改 AB,你可以这样做(使用 A 作为循环变量):

for( B+=direction, A != B; A += direction ) {

}

我玩了一把……不知道函数指针的内联规则是什么,或者这是否更快,但无论如何这都是一个练习。 =)

inline const size_t up( size_t& val ) { return val++; }
inline const size_t down( size_t& val ) { return val--; }

typedef const size_t (*FnIncDec)( size_t& );

inline FnIncDec up_or_down( size_t A, size_t B )
{
return (A <= B) ? up : down;
}

int main( void )
{
size_t A = 4, B = 1;
FnIncDec next = up_or_down( A, B );

for( next(B); A != B; next(A) ) {
std::cout << A << endl;
}

return 0;
}

对此的回应:

This won't work for case A = 0, B = UINT_MAX (and vice versa)

没错。问题是 iiEnd 的初始值由于溢出而变得相同。要处理这个问题,您可以使用 do->while 循环。这删除了初始测试,这是多余的,因为您将总是至少执行一次循环体...通过删除第一个测试,您迭代过去终止条件第一次。

size_t i = A;
size_t iEnd = B+direction;

do {
// ...
i += direction;
} while( i != iEnd );

关于c++ - 无论方向如何,从一个整数循环到另一个整数,开销最小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13868906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com