Visual Studio 2012和c++11的不同输出

Different Output in Visual Studio 2012 and c++11

本文关键字:输出 c++11 Studio 2012 Visual      更新时间:2023-10-16

以下代码在Visual Studio 2012和c++11中产生不同的输出:

问题:http://www.codechef.com/FEB14/problems/SUBMIN

小象在玩数组游戏。给定一个数组A0, A1,…, N个整数的AN−1。然后给出Q个查询,每个查询包含一个整数K。他必须告诉有多少个子数组满足条件:函数foo在应用于子数组时返回K。

在这个问题中,子数组定义为连续元素Ai, Ai+1,…, Aj其中0≤i≤j≤N−1。函数foo应用于数组时,返回数组中所有元素的最小值。

例如,foo应用于数组[7,5,10,7,5,8]时返回5。请注意,子数组Ai, Ai+1,…, Aj和Ak, Ak+1,…,当且仅当问题中i≠k或j≠l时,Al是不同的。

输入

输入的第一行包含N,表示数组的大小。下一行包含N个以空格分隔的整数A0, A1,…, AN−1,表示阵列。然后下一行包含Q,表示查询的数量。每个查询由每行一个整数组成,表示k。

输出

对于每个查询,打印所需的子数组数量。

输入:

5

4 1 2 3 4

4

3

4

6
1

VS2012和gcc 4.3.2的输出是

2
2
0
8

而gcc 4.8.1和c++11的输出是:

2
2
0
24
http://ideone.com/DUp72c

http://ideone.com/kFTlNe

代码:

int main() {
    map <int, vector<int> >b;
    int  arr[51], n;
    int ans = 0;
    cin >> n;
    for (int i = 0; i < n; i++)
    {
         cin >> arr[i];
         b[arr[i]].push_back(i);
    }
    int q, query, pos, l1, l2, vlength;
    cin >> q;
    while (q--)
    {
        ans = 0, l1 = 0, l2 = 0;
        cin >> query;
        vlength = b[query].size();
        int t = 0, c = 0;
        while (t < vlength){
            c = 1;
            for (size_t i = b[query].at(t) + 1; (i<n) && (arr[i] >= query); i++)
                if (arr[i] == query)
                {
                    c++;
                }
            for (size_t i = 0; i < c; i++)
            {
                l2 = 0;
                for (size_t k = b[query].at(t + i) - 1; (k >= 0) && (arr[k] > query); k--)
                    l2++;

                for (size_t j = i; j < c; j++)
                {
                    l1 = 0;
                    for (size_t m = b[query].at(t + j) + 1; (m<n) && (arr[m] > query); m++)
                        l1++;
                    ans += (l1 + 1)*(l2 + 1);
                }
            }
            t += c;
        }
        cout << ans << endl;

    }
    return 0;
}

这是由于下标超出范围。通过更改

再次检查
int arr[51];

array<int, 51> arr; 

您应该得到断言错误。我怀疑不同的输出是不同的编译器处理数组索引超出边界的行为的结果,在其中一种情况下,分配arr[I],其中I>50正在改变其他变量的值。