使用向量时,返回类型的函数更改时无法看到输出

时间:2018-04-01 15:43:59

标签: c++ function

在C ++中给出以下函数:

PS。在for循环中注意< =,因为vector的大小是[a.size()+ 1] [b.size()+ 1]

vector<int> lcs2(vector<int> &a, vector<int> &b) 
{
    vector<vector<int> >L(a.size() + 1 , vector<int>(b.size() + 1 , 0));
    for (int i = 0; i <= a.size(); ++i)
    {
        for (int j = 0; j <= b.size(); ++j)
        {
            if (i == 0 || j == 0)
                L[i][j] = 0;
            else if (a[i - 1] == b[i - 1])
                L[i][j] = L[i-1][j-1] + 1;
            else
                L[i][j] = std::max(L[i-1][j], L[i][j-1]);
        }
    }

    int index = L[a.size()][b.size()];
    vector<int> lcs(index + 1);

    int i = a.size() , j = b.size();
    while (i > 0 && j > 0)
    {
        if (a[i - 1] == b[j - 1])
        {
            lcs[index-1] = a[i-1]; 
            i--; j--; index--; 
        }
        else if (L[i - 1][j] > L[i][j - 1])
            --i;
        else
            --j;
    }
    return lcs;
}

当我在main()函数中运行以下命令时:

vector<int> lcs = lcs2(a , b);
std::cout << lcs.size() << std::endl;

我可以在控制台上获得输出。但是,当我对代码进行以下更改时:

  1. 将lcs2的返回类型更改为int
  2. 返回lcs.size()而不仅仅是lcs
  3. 将main()中的lcs数据类型从vector更改为int
  4. 将从lcs.size()输出的值更改为lcs
  5. 我无法在控制台上获得所需的输出。当我从VSCode运行构建任务时,我收到The terminal process terminated with exit code: 3221226356之类的消息。

    请帮我解决这个问题。

    PS。在lcs2()中的return语句之前,如果我添加一个语句来打印lcs.size()的值,那么它也可以正常工作。

1 个答案:

答案 0 :(得分:1)

你有一个循环

for (int i = 0; i <= a.size(); ++i)

然后在循环中访问a[i]。当i == a.size()时,这超出范围,因此您会得到未定义的行为。

尝试使用at方法(使用a.at(i)而不是a[i],并且类似地用于其他所有索引操作),并且您将获得异常而不是未定义的行为。