Ошибка инициализации указателя на вектор с использованием значения unordered_map

У меня есть класс под названием street_map, который содержит карту с ключами int и значениями типа vector<edge>, В одном из методов я пытаюсь инициализировать указатель на vector<edge> значение, чтобы получить его содержимое.

class street_map {
public:
    explicit street_map (const std::string &filename);
    bool geocode(const std::string &address, int &u, int &v, float &pos) const;
    bool route3(int source, int target, float &distance) const {
        auto it = adjacencyList.find(source);
        vector<edge>* v = &(it->second);
        return true;
    }
private:
    unordered_map<side , vector<segment>> map;
    unordered_map<int, vector<edge>> adjacencyList;
};

Линия vector<edge>* v = &(it->second); выдает ошибку:

Cannot initialize a variable of type 'vector<edge> *' with an rvalue of type 'const std::__1::vector<edge, std::__1::allocator<edge> > *'

Вот класс края:

class edge {
    int node;
    string street;
    float length;
    int startingNode;
public:
    edge(int startingNode, int node, string street, float length) {
        startingNode = startingNode;
        node = node;
        street = street;
        length = length;
    }
};

Мне интересно, если это из-за ключевого слова const и как это исправить, если это из-за ключевого слова const (я должен сохранить ключевое слово const, но я полагаю, что могу избавиться от него, если нет другого решения).

1 ответ

Решение

У вас есть четыре варианта:

1) Сделать указатель на вектор const

Вы не сможете изменить вектор.

bool route3(int source, int target, float &distance) const {
        auto it = adjacencyList.find(source);
        const vector<edge>* v = &(it->second);
        return true;
    }

2) Сделайте свой смежный список изменяемым

изменяемые средства, доступные как неконстантные из функции const - это может быть рискованно, если вы не обращаете внимания на свой дизайн доступа!

private:
    unordered_map<side , vector<segment>> map;
    mutable unordered_map<int, vector<edge>> adjacencyList;

3) Скопируйте вектор

Это может привести к более значительным накладным расходам, и изменения, сделанные в векторе, НЕ сохраняются на вашей карте

vector<edge> v = (it->second);

4) Сделать функцию неконстантной

Имейте в виду, что таким образом функция не может быть вызвана в контексте, где street_map это const!

bool route3(int source, int target, float &distance) {
        auto it = adjacencyList.find(source);
        vector<edge>* v = &(it->second);
        return true;
    }
Другие вопросы по тегам