我写了一些代码,这些代码必须在名字列表中找到一对。


  一对夫妻总是有相同的确切前缀,而男孩有后缀
  "ka",而女孩的后缀为"ki"
  
  例如:“ bipinka”和“ bipinki”是一对。
  
  在问题中,给我们N-名称的数量-后跟
  下一行由用空格分隔的字符串列表组成。


我的逻辑是我将检查每个名称的最后两个字母。如果它是"ka",则在删除最后两个字母后将其添加到ka向量中,对于"ki"也是如此。然后,我简单地进行相等性检查,如果相等,则将它们从向量中删除,因为3个"bipinka"不能共享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;
}


问题出在以下部分:

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
    }
}


如果输入为:

6
bipinki bipinka bipinka bipinka betiki betika


我的cout函数仅输出:

bipinki bipinka bipinka bipinka betiki


然后代码遇到Run Time Error - Out of Range.。我正在使用在线IDE,所以这是我看到的错误:
c&#43;&#43; - 读取字符串 vector 时超出范围运行时错误-LMLPHP

最佳答案

您的问题是在迭代时要从阵列中删除它。

由于您无法在此在线IDE上进行调试(我建议您下载VS Community 2015)。如果您有笔和纸,则记下这些值并进行迭代,然后在一半处擦除一个元素。

会发生什么?您的循环将超出范围。之所以会发生这种情况,是因为循环的范围是0 -> 5,并且在循环期间,已从数组中删除了一个(或多个)元素。现在,您的数组为0 -> 4,但是您的循环将趋于继续到达-> 5


  运行时错误-超出范围。

07-28 13:29