Ошибка инициализации указателя на вектор с использованием значения 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;
}