Не существует подходящего преобразования из "vector <string>" в "vector <string>" *? - PullRequest
0 голосов
/ 27 апреля 2018

Я пишу программу, которая получит текстовый файл, прочитает список имен из этого файла, отсортирует эти имена в алфавитном порядке, а затем напечатает отсортированный список обратно.

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

Но Intellisense выдает мне ошибку:

Нет подходящей функции преобразования из "std :: vector >" в "std :: vector > * "существует

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

#include<iostream>
#include<fstream>
#include<string>
#include<vector>
using namespace std;

int readFromFile(string[], string);
void displayArray(vector<string>[], int);
void alphaSort(vector<string>[], int);
void swap(string&, string&);


int main() {
//Declare variables
string fileName;
vector<string>names(1);
int nameQty;

//Prompt for file name
cout << "Please enter the name of the file to read names from: " << endl;
cin >> fileName;

//Call function to open file and read names into a vector array. Function will return the number of names in file
nameQty = readFromFile(names, fileName);

//Display unsorted names
cout << "Unsorted names:" << endl;
displayArray(names, nameQty);

//Sort names into alphabetical order
alphaSort(names, nameQty);

//Display sorted names
cout << "Sorted names:" << endl;
displayArray(names, nameQty);

//More to come after this; program isn't done yet!
}

/*
* Function to read a list from a text file into an array.
* The array starts at size 1, then increments by 1 for each subsequent iteration
* The array then deletes the final element when there is nothing more to read
* (since the last element will be uninitialized)
*/
int readFromFile(vector<string> array, string fileName) {

ifstream inputFile;
inputFile.open(fileName);

if (!inputFile) {
    cout << "Invalid file name. Please restart program and try again."
        << endl;
    system("pause");
    exit(EXIT_FAILURE);
}

else {
    int index = 0;
    while (inputFile) {
        cin >> array[index];
        array.push_back;
        index++;
    }
    array.pop_back;
    inputFile.close();
    return (index + 1);
}
}

//Function to display list of items in array
void displayArray(vector<string> array[], int quantity) {
    for (int i = 0; i < quantity; i++)
        cout << array[i] << endl;
}

//Selection sort function puts array elements in alphabetical order
void alphaSort(vector<string> names[], int qty) {
    for (int j = 0; j < qty - 1; j++) {

        for (int i = j + 1; i < qty; i++) {
            if (names[j] > names[i]) {
                swap(names[j], names[i]);
            }
    }
}

}

//Function to swap elements a and b in array
void swap(string &a, string &b) {
    string temp = a;
    a = b;
    b = temp;
}

Пожалуйста, не беспокойтесь о моем использовании system("pause") и using namespace std. Я знаю, что это плохая практика, но это то, что нас просили делать в классе.

1 Ответ

0 голосов
/ 27 апреля 2018

Вы хотите:

void displayArray(vector<string>& array, int quantity)

или в этом случае еще лучше:

void displayArray(const vector<string>& array, int quantity)

В вашем коде кажется, что вы пытаетесь передать массив векторов (что не так просто в C ++ и сводится к указателю на вектор в этом случае). Чтобы избежать копирования, вы должны использовать ссылку.

Вам также может быть интересно прочитать о семантике перемещения .

Также, как отмечено в комментариях, вы также можете исправить readFromFile:

int readFromFile(vector<string>& array, string fileName)

При изменении ссылки на функцию функция будет изменять вектор вызывающего абонента вместо создания и изменения локальной копии.

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