Вы указали, что на каждой строке начальное значение является последовательным ключом, а остальные значения на каждой строке состоят из разделенных пробелами разделителей, каждый из которых является двумя значениями, разделенными запятой, причем первое значение является некоторым другим идентификатором, и поэтому первое значение всех кортежей в одной строке будет уникальным.
Как таковой, я хотел бы предложить следующую структуру данных:
typedef std::vector<std::map<int, int>> map_t;
индекс вектор должен быть начальным ключом. Ваши векторные индексы основаны на 0, и в вашем файле данных они основаны на 1, но это достаточно просто, чтобы обрабатывать «на лету». Либо измените свой файл данных, либо просто выполните ключ 0 без данных.
Каждое значение в векторе представляет собой карту. Ключ карты - это идентификатор «другого узла», а значение - расстояние до другого узла - в соответствии с вашим описанием того, что означают эти данные.
Эта структура данных будет моделировать эти данные. Теперь, насколько этот вопрос чтения и разбора эти данные:
Ваш первоначальный подход является правильным: использовать std::getline()
читать каждую строку в то время в строку:
map_t my_map;
std::string line;
while (std::getline(inputFile, line)) {
// Here be dragons
}
Там нет ничего, чтобы быть получен из помещая каждый line
в вектор строк. Мы можем просто анализировать каждую строку, когда мы ее читаем. Внутри цикла мы обработаем каждую прочитанную строку и поместим ее данные непосредственно в my_map
. Это план. Простой, легкий и простой.
Внутри цикла, мы начинаем, помещая каждую строку в std::istringstream
для того, чтобы разобрать его, а затем извлечь начальный узел ID:
int node_id;
std::istringstream line_stream(line);
line_stream >> node_id;
достаточно просто. Если вам нужно обрабатывать плохой ввод, вы должны быть в состоянии выяснить, как проверить ошибки преобразования самостоятельно здесь и в остальном коде.
Теперь мы тогда просто нужно срывать каждый «other_node, расстояние» пары кортеж:
std::string node_distance;
std::map<int, int> node_distance_map;
while (line_stream >> node_distance)
{
// Here be more dragons.
}
И вот что. Внутри цикла, где больше драконов, node_distance
будет каждой отдельной строкой «n, n» с двумя значениями. Это достаточно просто для вас, чтобы выяснить самостоятельно: как извлечь эти два ints из этой строки самостоятельно; затем обновите node_distance_map
. Затем, после этого while_loop
, вы берете построенный node_distance_map
и извлечение node_id
раньше, и просушите все это в my_map
. Миссия выполнена. Это было не очень сложно, не так ли?
'std :: map >>' может быть, что вы после, но, возможно, нет. Пожалуйста, расширьте то, как вы собираетесь использовать эти данные. Там могут быть лучшие варианты. –
user4581301
ключи являются «узлами», а значения «другим узлом, длиной края для узла» и мне нужно использовать алгоритм dijkstras для нахождения кратчайшего пути – Zach
ключи - это первые числа 1-8? –