运行代码时出现运行时错误

Vai*_*jaj 0 c++ string vector

编辑:谢谢你帮助我.我的问题再次得到了支持.如果我的问题措辞严厉,我很抱歉.我尽量让它变得易于理解.再次感谢.

我写了一些代码,必须在名单列表中找到情侣.

一对夫妇总是有相同的确切前缀,男孩有后缀, "ka"而女孩有后缀"ki".

例如:"bipinka"和"bipinki"是一对.

在这个问题中,我们给出了N- 名称的数量 - 在下一行后面跟一个由空格分隔的字符串列表.

我的逻辑是我将检查每个名字的最后两个字母.如果是"ka",我ka删除最后两个字母后将其添加到向量中,同样为"ki".然后我只是做一个相等检查,如果相等,将它们从向量中删除,因为3 "bipinka"s不能共享1 "bipinki"作为他们的配偶.

我的代码如下:

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>

#define sd(n) scanf("%d", &n)
#define slld(n) scanf("%lld", &n)
#define slf(n) scanf("%lf", &n)
#define pd(n) printf("%d\n", n)
#define plld(n) printf("%lld\n", n)
#define plf(n) printf("%lf\n", n)
using namespace std;

int main() {
    int N, i, j;
    string names[1001];
    vector<string> ka, ki;
    sd(N);
    for(i=0;i<N;i++)
    {
        cin >> names[i];
        cout << names[i] << " "; //Entered this to check for error.
        string lastTwo = names[i].substr(names[i].size()-2);
        string name = names[i].substr(0, names[i].size()-2);
        if (lastTwo == "ka")
        {
            ka.push_back(name); 
        }
        else if (lastTwo == "ki")
        {
            ki.push_back(name);
        }
    }
    int ctr = 0;
    for(i=0; i<ka.size();i++)
    {
        for(j=0;j<ki.size(); j++)
        {
            if(ka[i] == ki[j])
            {
                ka.erase(ka.begin() + i - 1);
                ki.erase(ki.begin() + j - 1);
                ctr++;
            }
        }
    }
    cout << ctr<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

问题在于这一部分:

for(i=0;i<N;i++)
{
    cin >> names[i];
    cout << names[i]; //Entered this to check for error.
    string lastTwo = names[i].substr(names[i].size()-2); //last two letters of name
    string name = names[i].substr(0, names[i].size()-2); //name without last two letters
    if (lastTwo == "ka")
    {
        ka.push_back(name); //Pushing in ka vector
    }
    else if (lastTwo == "ki")
    {
        ki.push_back(name); //Pushing in ki vector
    }
}
Run Code Online (Sandbox Code Playgroud)

如果给出的输入是:

6
bipinki bipinka bipinka bipinka betiki betika
Run Code Online (Sandbox Code Playgroud)

我的cout功能只输出:

bipinki bipinka bipinka bipinka betiki
Run Code Online (Sandbox Code Playgroud)

然后代码遇到了Run Time Error - Out of Range..我正在使用在线IDE,所以这是我看到的错误: 在此输入图像描述

Kha*_*laf 5

你的问题是,你从数组删除WHILE你迭代在同一阵列.

由于您无法在此在线IDE上进行调试(我建议您下载VS Community 2015).如果您有一支笔和一张纸,请将值写下来并迭代它们,然后在中途擦除一个元素.

会发生什么事?你的循环将超出范围.这将发生,因为你的循环范围是让我们说的0 -> 5,并且循环期间,一个(或多个)元素从你的数组中删除.现在,你的数组是,0 -> 4但你的循环将倾向于继续到达-> 5..惊喜:

运行时错误 - 超出范围.