C ++ Vector неприятности

0

Это функция моей программы, которая продолжает сбой. Целью функции является поиск по векторам и отображение того, что они оценивают, и частоты, которая считывается в соответствующие векторы. Я предполагаю, что мой цикл 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
    Вам нужно установить i обратно в 0 перед второй в while цикла.
  • 0
    Был бы полезен минимальный законченный пример , в противном случае нам приходится много гадать.
Показать ещё 6 комментариев
Теги:
vector
search

2 ответа

1

Во-первых, в любом из ваших циклов вы не меняете значение i, поэтому они потенциально бесконечны.

Во-вторых, если я понимаю, что вы пытаетесь сделать, у вас есть парные векторы, и вы ищете индекс, по которому имя находится в первом векторе, а затем используйте его для получения значения из второго вектора. Вы можете использовать функцию std::find для этого:

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

Теперь вы можете получить доступ к girlsfreq[frank]. Если имя отсутствует в векторе, frank равно размеру вектора, который вы должны проверить. Не забудьте добавить:

#include <algorithm>
  • 0
    Это все еще падает.
  • 0
    Как именно и где? Вы можете опубликовать обновленный код?
Показать ещё 1 комментарий
0

Я не могу воспроизвести ваш крах. Вместо этого я могу воспроизвести бесконечный цикл. Присмотревшись к вашим в while циклы, то становится очевидным: значение я никогда не меняется. Если он не может найти совпадение имен, он будет продолжать увеличивать значение frank. Таким образом, исправление этой проблемы будет:

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

Но его можно улучшить: вам не нужно это задание. Кроме того, вы можете использовать преимущество приращения postfix:

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

При этом вы также удалите необходимость name и name1.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню