Какое имя переменной я должен передать своей функции для сортировки? - PullRequest
0 голосов
/ 30 апреля 2020

Редактировать: я понял, что одной из моих проблем было то, что я пытался заставить мою функцию сортировки сортировать строку, которая, очевидно, не работала.

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

//Name
//This program will read and sort names and grades from a file using functions and vectors
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <vector>
using namespace std;

//Function prototype
void selectionSort(vector<int>& vector_values);

int main()
{
    ifstream infile;
    infile.open("student.txt");

    if (infile.fail() == false)
    {
        vector<string> all_names;
        vector<int> all_scores;
        string name;
        int score;
        while (infile >> name >> score) // read one name and one score
        {
            all_names.push_back(name); // add that name to vector
            all_scores.push_back(score); // add that score to vector
            selectionSort();
            cout << name << " "<< score<<", ";
        }

    }
    else
    {
        cout << "Could not open the file." << endl;
    }
return 0;
}

void selectionSort(vector<int>& vector_values)
{
    for (unsigned pass = 0; pass < vector_values.size(); pass++)
    {
        int minimum = vector_values[pass];
        int minimum_index = pass;
        for (unsigned index = pass + 1; index < vector_values.size(); index++)
        {
            if (minimum > vector_values[index])
            {
                minimum = vector_values[index];
                minimum_index = index;
            }
        }

        int temp = vector_values[minimum_index];
        vector_values[minimum_index] = vector_values[pass];
        vector_values[pass] = temp;
    }
}

1 Ответ

0 голосов
/ 30 апреля 2020

Сначала необходимо прочитать все значения, а затем отсортировать их после l oop.

Функция сортировки объявлена ​​как:

void selectionSort(vector<int>& vector_values);
//                 ~~~~~~~~~~~~

, что означает, что она может принимать std::vector<int> по ссылке. Итак, со ссылкой на ваш код вам нужно передать all_scores, потому что он того же типа, который требуется для функции сортировки.

Итак, ваш код будет выглядеть так:

// Read values into the vectors
while (infile >> name >> score)
{
    all_names.push_back(name);
    all_scores.push_back(score);
}

// Values are populated, now sort here
selectionSort( all_scores );

Если вам необходимо использовать std::vector, а также хотите сохранить связь между именами и связанными с ними баллами, альтернативным решением может быть std::vector<std::pair<std::string, int>> или std::vector агрегированного типа. т. е. struct или class.

С двумя векторными ограничениями вам нужно передать оба в функцию сортировки; и меняйте имена, когда вы меняете баллы, чтобы сохранить их взаимосвязь.

Для дальнейшего использования вы можете обратиться к ассоциативным контейнерам, таким как std :: map , чтобы решить такие проблемы.

...