Visual Studio 2012 和 c++11 中的不同输出
Posted
技术标签:
【中文标题】Visual Studio 2012 和 c++11 中的不同输出【英文标题】:Different Output in Visual Studio 2012 and c++11 【发布时间】:2014-07-17 13:00:15 【问题描述】:以下代码在 Visual Studio 2012 和 c++11 中产生不同的输出。
问题:
http://www.codechef.com/FEB14/problems/SUBMIN
小象正在玩数组游戏。给他一个包含 N 个整数的数组 A0, A1, ..., 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, ..., Al 在此问题中当且仅当 i ≠ k 或 j ≠ l 时是不同的。
输入
输入的第一行包含 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;
【问题讨论】:
你能解释一下这段代码应该做什么吗?这只是一个代码转储。 嗯,这是我对 codechef 问题的回答。 codechef.com/FEB14/problems/SUBMIN 如果你投反对票,请在 cmets 中说明原因。这不是为了解决任何问题。解决方案已经在 gcc 4.3.2 中提交 -1。完全没有使用或上下文。 (0) 没有提到提供的输入,只是输出。 (1) 没有说明代码的用途。如果场外链接提供了该链接,请重新访问它并将该描述复制到此处。 (2) 这里还有一个问题吗?如果有,是什么? 我现在已经为这个问题提供了尽可能多的知识。不过,要解决的问题是次要的。问题是关于我想要解释的行为差异。如果需要任何其他编辑,请发表评论。 【参考方案1】:这是由于下标超出范围。通过更改进行仔细检查
int arr[51];
到
array<int, 51> arr;
你应该得到断言错误。我怀疑不同的输出是在处理超出范围的数组索引时不同的编译器行为的结果,在其中一种情况下分配 arr[i] 其中 i>50 正在更改其他变量的值。
【讨论】:
仅仅更改为std::array
是不够的。他还必须使用at()
成员函数来进行边界检查。
是的,答案如您所描述。实际上在第 38 行它是在 k 为 -1 时引起的。由于 k 是 size_t,它为 k 分配了一些较大的值。到这里,问题已经解决了:ideone.com/ZcpdWH以上是关于Visual Studio 2012 和 c++11 中的不同输出的主要内容,如果未能解决你的问题,请参考以下文章
visual studio2012中 c语言编译出来的程序怎么暂停啊
C++ Visual Studio 2012 到 Linux
Visual Studio 2012 和 2010 中基于 Opengl Sierpinski Shader 的 C 代码