有人可以告诉我这个程序有什么问题吗? 我们的想法是展示"是"如果向量数组满足所有这些条件: 数组元素未按升序排序。 该数组包含不同的元素。 所有数组元素的值都应在1到n之间。 否则"否"。 程序在到达if(bSort)的行时中止。 迭代器增量有什么问题吗?
#include <iostream>
#include <string>
#include <bits/stdc++.h>
using namespace std;
std::string solve(vector <int> &a, int n) {
vector<int> visited (n);
int i=0;
for(std::vector<int>::iterator it = a.begin(); it != a.end(); ++it) {
i++;
if((it+1)!=a.end() && (*it > *(it+1)))
{
bSort = false;
}
if(std::find(visited.begin(), visited.end(), *it)!=visited.end())
{
return "No";
}
else
{
visited[i] = *it;
}
if(*it <= 0 || *it > n)
{
return "No";
}
}
if(bSort)
return "No";
else
return "Yes";
}
int main() {
int q;
cin >> q;
for(int a0 = 0; a0 < q; a0++){
int n;
cin >> n;
vector<int> a(n);
for(int a_i = 0; a_i < n; a_i++){
cin >> a[a_i];
}
std::string result = solve(a,n);
cout << result << endl;
}
return 0;
}
问题似乎只发生在以下输入中:
1
30
18 8 24 20 7 17 5 9 26 21 25 12 11 15 30 13 19 16 22 10 14 1 3 29 23 2 6 28 4 27
答案 0 :(得分:1)
我不确定问题是否与迭代器有关。
在循环的最开始,变量i
在使用之前递增,这意味着i
介于其间的数字集合为[1, vector.size()]
。这意味着在某些时候,您将访问vector[vector.size()]
,这是未定义的行为并且可能导致程序崩溃。
在您的程序中,根据您提供的输入,因为示例代码中的数字都不重复,所以else
条件语句的std::find(...)
分支始终执行,这意味着您结束在某个时刻调用visited[30]
,这又是超出界限和未定义的行为,可能导致崩溃。