min的奇怪行为

Pra*_*hah 0 c++

typedef long long ll;

ll maxtokens(vector<ll>::iterator beg, vector<ll>::iterator end)
{
    ll min, j = 0, n = end - beg;
    if(n == 1) 
        return *beg;

    for(int i = 1, min = *beg; i < n; i++)
    {
        ll t = *(beg + i);
        if(min > t)
        {
            min = t;
            j = i;
        }
        // cout << min << " " << (*(beg + i)) << endl;
    }
        // cout << min << " " << j << endl;

    if(j == 0)
        return n*min;

    for(int i = 0; i < j; i++)
        *(beg + i) -= min;

    return maxtokens(beg, beg + j) + n*min;
}
Run Code Online (Sandbox Code Playgroud)

这是用于 codechef 中的问题的函数。我发现奇怪的是 min 的值,所以我使用调试器在每一步查看 min 的值,发现 min 的值与循环内的预期一致,但是一旦退出,存储在 min 内的 for 循环值更改为一个垃圾值。如果我在 for 循环之前写 min=*beg,这个错误就会被删除。我不明白为什么 min 的值会自行改变。

ll 代表 long long int

你能告诉我我哪里做错了吗?

我不知道该使用哪个标签,所以我只使用了 c++,请告诉我我应该使用哪些其他标签以备将来参考。

虽然我认为这不会有任何帮助,但这里有问题https://www.codechef.com/LRNDSA02/problems/STUPMACH

提前致谢。

cig*_*ien 5

您正在隐藏min循环中的变量。在这个片段中

int min = 1;
for (int i = 0, min = 5; i < n; ++i)  // this declares a new 'min'
  // ...
Run Code Online (Sandbox Code Playgroud)

min在for循环是一个比外面不同。因此,min对循环内部的任何更改都不会影响min循环外部。

请注意,在表达式中

int i = 0, min = 5;
Run Code Online (Sandbox Code Playgroud)

双方 imin有新的变数。

在这种情况下,更简单的方法是使用算法,如下所示:

int min = *std::min_element(beg, end);
Run Code Online (Sandbox Code Playgroud)

这完全避免了必须编写循环。