#c
Вопрос:
У меня есть следующий класс:
namespace detail {
class AdjacencyListGraphBase {
protected:
// these are the edges in the graph - each outbound edge comes with a weight
std::vector<std::vector<std::pair<uint32_t, float>>> edges;
virtual size_t get_num_nodes() const = 0; // call the derived class to get the number of nodes
public:
void add_edge(uint32_t from, uint32_t to, float weight=1.0f);
void remove_edge(uint32_t from, uint32_t to);
std::optional<float> get_edge(uint32_t from, uint32_t to) const;
const std::vector<std::pair<uint32_t, float>>amp; get_edges_starting_at(uint32_t node) const;
};
}
и я хочу добавить элемент со следующей функцией:
void detail::AdjacencyListGraphBase::add_edge(uint32_t from, uint32_t to, float weight)
{
if(!(edges[from][to].first==to)){
edges[from][to].first = to;
edges[from][to].second = weight;
}
}
но когда я вызываю эту функцию, я получаю следующую ошибку: SIGSEGV — сигнал о нарушении сегментации. Я не знаю, что я здесь делаю не так. Нужно ли изменять размер векторных ребер? Или чего-то не хватает, чего я не вижу?
Заранее спасибо!
Комментарии:
1. это зависит от того, что вы передаете своей функции в качестве аргументов «от» и «до». Возможно, вам потребуется изменить размер вектора или использовать метод push_back (), если индекс больше, чем vector.size()
2.
edges[from][to]
— Измените это на это:edges.at(from).at(to)
. Если вы выходите за рамки, вместоstd::out_of_range
ошибки seg вы получите сообщение об ошибке.3. Прежде чем получить доступ к значению позиции, сначала проверьте, является ли это допустимой позицией. Например, если( от < edge.size() amp;amp; до
4. Хорошо, спасибо! Я применил ваше решение, и оно сработало!