C++ Visual Studio 2012和c++;11

C++ Visual Studio 2012和c++;11,c++,visual-studio,visual-studio-2012,gcc,c++11,C++,Visual Studio,Visual Studio 2012,Gcc,C++11,以下代码在Visual Studio 2012和c++11中生成不同的输出 问题: 小象正在玩阵列游戏。给他一个数组A0,A1,…,an−N个整数中的1个。然后给出Q查询,每个查询包含一个整数K。他必须告诉有多少子数组满足条件:当函数foo应用于子数组时,它返回K 在这个问题中,子数组被定义为连续元素Ai,Ai+1,…,Aj的序列,其中0≤ 我≤ J≤ N−1.函数foo应用于数组时,返回数组中所有元素的最小值 例如,当foo应用于数组[7,5,10,7,5,8]时,它返回5。请注意,子数组A

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

问题:

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

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

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

输入

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

输出

对于每个查询,打印所需数量的子阵列

输入:

五,

41234

四,

三,

四,

六,

一,

VS2012和gcc 4.3.2中的输出为

2
2
0
8
而gcc 4.8.1和c++11中的输出是:

2
2
0
24

代码:

intmain(){
地图b;
int-arr[51],n;
int ans=0;
cin>>n;
对于(int i=0;i>arr[i];
b[arr[i].向后推(i);
}
int q,查询,pos,l1,l2,长度;
cin>>q;
而(q--)
{
ans=0,l1=0,l2=0;
cin>>查询;
vlength=b[query].size();
int t=0,c=0;
而(t=0)和&(arr[k]>query);k--)
l2++;
对于(尺寸j=i;jcout这是由于下标超出范围。请通过更改

int arr[51];

阵列arr;

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

你能解释一下这段代码应该做什么吗?这只是一个代码转储。这是我对codechef问题的回答。如果你投反对票,请在评论中说明原因。这不是为了解决任何问题。gcc 4.3.2-1中已经提交了解决方案。完全没有使用或上下文。(0)没有提及提供的输入,只是输出。(1)没有说明代码的用途。如果非现场链接提供了这一点,请重新访问它并将说明复制到此处。(2)这里有问题吗?如果有,是什么?我现在已经提供了尽可能多的知识来回答这个问题。不过,要解决的问题是次要的。这个问题是关于行为上的差异,我想对此进行解释。如果需要任何其他编辑,请发表评论。仅仅更改为
std::array
是不够的。他还必须使用
at()
成员函数进行边界检查。是的,答案如您所述。实际上,在第38行中,它是在k为-1时产生的。因为k是size\u t,它为k指定了一些较大的值。在这里,问题已得到解决:
int arr[51];
array<int, 51> arr;