Добавление элемента в вектор пары приводит к ошибке: сигнал о нарушении сегментации

#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. Хорошо, спасибо! Я применил ваше решение, и оно сработало!