这是我的程序的一个功能,它不断崩溃。该功能的目的是搜索向量并显示它们的等级和频率,将其读入相应的向量。我猜它是我的while循环,但我不确定。 正确读入了向量。
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;
}
}
答案 0 :(得分:1)
首先,在任何循环中,您都不会更改i
的值,因此它们可能是无限的。
其次,如果我理解你正在尝试做什么,你有成对的向量,你搜索一个名称在第一个向量中的索引,然后用它来从第二个向量中获取值。您可以使用std::find
函数:
int frank = find(girlsname.begin(), girlsname.end(), name1) - girlsname.begin();
现在,您可以访问girlsfreq[frank]
值。如果向量中不存在该名称,则frank
等于向量的大小,您必须检查该向量。不要忘记添加include:
#include <algorithm>
答案 1 :(得分:0)
我无法重现您的崩溃。相反,我能够重现无限循环。仔细研究一下while
循环,很明显:i的价值永远不会改变。如果找不到名称匹配,它将继续增加frank
的值。所以,解决这个问题的方法是:
while(i < SIZE && name1 != name) {
name = girlsname[i];
frank++;
i++;
}
但它可以改进:你不需要那个任务。此外,您可以使用后缀增量的优势:
while(i < SIZE && name1 != girlsname[i++]){
frank++;
}
执行此操作时,您还删除了name
和name1
。