C++矢量故障

C++ Vector troubles

本文关键字:故障 C++      更新时间:2023-10-16

这是我的程序的一个函数,它不断崩溃。该函数的目的是搜索矢量,并显示它们的排名和频率,这些频率被读取到各自的矢量中。我猜这是我的时间循环,但我不确定。矢量被正确读取。

void searchNames(vector<string> girlsname,vector<int> girlsfeq,vector<string> boysname,vector<int> boysfeq){
    string name1;
    string name;
    int SIZE = girlsname.size();
    int SIZE2 = boysname.size();
    while(name1 != "quit"){
        int i=0;
        int frank=find(girlsname.begin(), girlsname.end(), name1) - girlsname.begin();
        int mrank=find(boysname.begin(), boysname.end(), name1) - boysname.begin();
        name1.clear();
        name.clear();
        cout << "Please enter a name: ";
        cin >> name1;
        cout << endl;
        while(i< SIZE && name1 !=girlsname[i++]){
       frank++;
        }
        name.clear();
        i=0;
        while(i< SIZE2 && name1 !=boysname[i++]){
        mrank++;
        }
        cout << left << setw(15) << "Name" << right << setw(10) << "Girl Rank" << right << setw(10) << "Frequency" << right << setw(10) << "Boy Rank"<< right << setw(10) << "Frequency" << endl;
        if(frank != SIZE && mrank != SIZE2){
        cout << left << setw(15) << name1 << right << setw(10) << frank << right << setw(10) << girlsfeq[frank] << right << setw(10) << mrank << right << setw(10) << boysfeq[mrank] << endl;
} 
}

首先,在任何循环中,都不会更改i的值,因此它们可能是无限的。

其次,如果我理解你想做什么,你有一对向量,你搜索一个索引,名字在第一个向量中,然后用它从第二个向量中得到值。您可以使用std::find函数:

int frank = find(girlsname.begin(), girlsname.end(), name1) - girlsname.begin();

现在,您可以访问girlsfreq[frank]值。如果名称不在矢量中,则frank等于矢量的大小,您必须检查该大小。别忘了添加include:

#include <algorithm>

我无法重现您的崩溃。相反,我能够再现一个无限循环。仔细观察while循环,就会发现:i的值永远不会改变。如果找不到名称匹配,它将继续递增frank的值。因此,解决这个问题的方法是:

    while(i < SIZE && name1 != name) {
        name = girlsname[i];
        frank++;
        i++;
    }

但它是可以改进的:你不需要那个任务。此外,您还可以使用后缀增量的优势:

    while(i < SIZE && name1 != girlsname[i++]){
        frank++;
    }

这样做,也就消除了namename1的必要性。