Как определить векторы конца, чтобы они не продолжались бесконечно? - PullRequest
2 голосов
/ 08 апреля 2019

На данный момент у меня есть текстовый файл, содержащий информацию, относящуюся к разным музыкантам.

David Byrne 1 Talking_Heads Lead-Vocals
Chris Frantz 1 Talking_Heads Drummer
Tina Weymouth 3 Talking_Heads Compass_Point_All_Stars Tom_Tom_Club Bass

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

while (artist >> forname >> surname >> bandnum)
    {
        for (int i = 0; i < bandnum; i++)
        {
            string tmp;
            artist >> tmp;
            band.push_back(tmp);
        }
        artist >> role;


        if (strF == forname && strS == surname) {
            system("CLS");
            cout << "Artist found" << endl;
            cout << forname << " " << surname << " ";
            ostream_iterator<string> output_iterator(cout, " ");
            copy(band.begin(), band.end(), output_iterator);
            cout<< role << endl;
            system("pause");
        }
    }

Выше приведен код, который должен прочитать число перед именами и сделать вектор такого размера, который содержит каждую полосу, вместо этого он создает бесконечный вектор.

1 Ответ

1 голос
/ 08 апреля 2019

Вы перезаписываете значения forname, surname, bandnum и role каждого цикла, но оставляете вектор band, чтобы продолжать расти и расти - сохраняя информацию о прошлых художниках. Вам нужно чистить и очищать его после каждого цикла!

Простой вызов clear() - это все, что вам нужно. Просто добавьте следующую строку в начале (или в конце, если хотите) вашего цикла while:

band.clear();

Вот оно, в действии: ideone

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...