| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 | #include <fstream>#include <iostream>#include "Reader.h"const std::string& Reader::getName(int id) {    return names[id];}const std::vector<int>& Reader::operator[](int x) const {    return distances[x];}int Reader::getOrAddId(const std::string& s) {    auto found = nameToId.find(s);    if(found != nameToId.end()) {        return found->second;    }    int id = ids++;    nameToId[s] = id;    for(std::vector<int>& inner : distances) {        inner.push_back(-1);    }    distances.push_back(std::vector<int>(ids, -1));    distances.back()[ids - 1] = 0;    names.push_back(s);    return id;}std::string Reader::trim(const std::string& s) const {    size_t start = 0;    while(start < s.length() && s[start] == ' ') {        start++;    }    size_t end = s.length();    while(end > 0 && s[end - 1] == ' ') {        end--;    }    return s.substr(start, end - start);}bool Reader::read(const char* path) {    std::ifstream in;    in.open(path);    if(!in.good()) {        std::cout << "cannot find data\n";        return true;    }    while(!in.eof()) {        std::string s;        std::getline(in, s);        if(s.find("road(", 0) != 0) {            continue;        }        s = s.substr(5, s.length() - 5);        size_t fromIndex = s.find(",", 0);        if(fromIndex == s.npos) {            continue;        }        size_t toIndex = s.find(",", fromIndex + 1);        if(toIndex == s.npos) {            continue;        }        size_t distanceIndex = s.find(")", toIndex + 1);        if(distanceIndex == s.npos) {            continue;        }        std::string from = trim(s.substr(0, fromIndex));        std::string to = trim(s.substr(fromIndex + 1, toIndex - fromIndex - 1));        std::string distanceString =            trim(s.substr(toIndex + 1, distanceIndex - toIndex - 1));        int fromId = getOrAddId(from);        int toId = getOrAddId(to);        int distance = std::stoi(distanceString);        distances[fromId][toId] = distance;        distances[toId][fromId] = distance;    }    return false;}void Reader::print() const {    for(size_t x = 0; x < distances.size(); x++) {        for(size_t y = 0; y < distances[x].size(); y++) {            printf("%3d ", distances[x][y]);        }        std::cout << "\n";    }}
 |