Flight Finder C ++ unordered_map - PullRequest
       9

Flight Finder C ++ unordered_map

0 голосов
/ 30 сентября 2018

У меня проблемы с поиском добавления второго вектора на рейс.Например, когда я достигаю sfo lax 89 в файле данных, lax 89 не добавляется в sfo в unordered_map.

Тестовые данные:

stl jfk 99
ord jfk 199
cle jfk 179
sfo jfk 388
sfo lax 89
stl cle 77
lax cle 30
sfo stl 200
ord stl 99

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

Я пытаюсь заставить мои сохраненные данные выглядеть следующим образом.

unordered_map<string, unordered_map<string, int>> vertices;

stl {jfk 99, cle 179}
ord {jfk 199, stl 99}
cle {jfk 179}
sfo {jfk 388, lax 89, stl 200}
lax {cle 30}

Я пытался использовать temp для хранения второго unordered_mapв вершинах с помощью temp.insert () для хранения рейсов, вылетающих из заданного аэропорта, со стоимостью.Затем, используя функцию add_vertex (), которую я создал.

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

class Flight {

public:

unordered_map<string, unordered_map<string, int>> vertices;
int cost;

void add_vertex(string name, unordered_map<string, int>& edges){
    // Insert the connected nodes in unordered map
    vertices.insert(unordered_map<string, unordered_map<string, int>>::value_type(name, edges));
    }
};

void readData(ifstream &data2 , Flight &f, Flight &c) {
    while (true) {
        string
            departure,  // departure loc
            departureK,
            arrival,    // arrival loc
            arrivalk;
        string arrivals[250];
        int costs[250];
        int cost, costK;       // cost
        int size = 0;
        int pos;

        data2 >> departureK;
        if (data2.eof()) {
            return;
        }
        data2 >> arrivalk;
        data2 >> costK;

        pos = data2.tellg();
        unordered_map<string, int> temp;
        temp.insert(unordered_map<string, int>::value_type(arrivalk, costK));
        bool run = true;
        while (run) {
            data2 >> departure;
            if (data2.eof()) {
                run = false;
                return;
            }
            data2 >> arrival;
            data2 >> cost;
            if (departureK == departure) {
                arrivals[size] = arrival;
                costs[size] = cost;
                size++;
            }
        }
        for (int i = 0; i < size; i++) {
            temp.insert(unordered_map<string, int>::value_type(arrivals[i], costs[i]));
        }
        f.add_vertex(departureK, temp);
        c.add_vertex(departureK, temp);
        temp.clear();
        size = 0;
        data2.seekg(pos);

        /*data2 >> departure;
        if (data2.eof()) {
            return;
        }
        data2 >> arrival;
        data2 >> cost;
        unordered_map<string, int> temp;
        temp.insert(unordered_map<string, int>::value_type(arrival, cost));
        f.add_vertex(departure, temp);
        c.add_vertex(departure, temp);
        temp.clear();*/
    }
}

int main() {
    ifstream data2;

    char fileName[25];  // a string for filenames

    data2.clear();
    cout << "Please enter the name of the input file: ";
    cin >> fileName;

    data2.open(fileName, ios::in);
    if (!data2) {
        cerr << "Can't open input file " << fileName << endl;
        exit(1);
    }
    // checks file
    Flight f, c;
    readData(data2, f, c);
}

1 Ответ

0 голосов
/ 30 сентября 2018

Вы слишком усложнили свой код.Если вы прочитаете спецификации для std::unordered_map::operator[], вы увидите, что оно автоматически добавляет новое значение, когда его еще нет:

Ссылка на сопоставленное значениеновый элемент, если не было элемента с ключом key.В противном случае ссылка на сопоставленное значение существующего элемента, ключ которого эквивалентен ключу.

Так что все, что вам нужно сделать, это прочитать данные из вашего файла в departure, arrival и cost, а затем выполните vertices[departure][arrival] = cost;.

Если для отправления уже существует внутренняя карта, к ней добавляется новое прибытие.А если нет, то создается новая карта, а затем к ней добавляется прибытие.

Полный пример реализации вашего readData метода:

void readData(std::ifstream& data, Flight &f, Flight &c)
{
    std::string departure;
    std::string arrival;
    int cost;
    while (data >> departure >> arrival >> cost)
    {
        f.vertices[departure][arrival] = cost;
        c.vertices[departure][arrival] = cost;
    }
}

(Пожалуйста,не то, чтобы этот код предполагал, что файл всегда действителен и не включает обработку ошибок.)

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