程序在使用向量迭代器时中止

时间:2017-09-07 16:39:18

标签: c++ c++11 vector

有人可以告诉我这个程序有什么问题吗? 我们的想法是展示"是"如果向量数组满足所有这些条件:  数组元素未按升序排序。  该数组包含不同的元素。  所有数组元素的值都应在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

1 个答案:

答案 0 :(得分:1)

我不确定问题是否与迭代器有关。

在循环的最开始,变量i在使用之前递增,这意味着i介于其间的数字集合为[1, vector.size()]。这意味着在某些时候,您将访问vector[vector.size()],这是未定义的行为并且可能导致程序崩溃。

在您的程序中,根据您提供的输入,因为示例代码中的数字都不重复,所以else条件语句的std::find(...)分支始终执行,这意味着您结束在某个时刻调用visited[30],这又是超出界限和未定义的行为,可能导致崩溃。