如何从c ++中的自定义列表类型中删除元素?

时间:2016-09-09 01:37:25

标签: c++ stl

我正在尝试用C ++实现邻接列表。我想编写一个函数来从顶点删除边。

请参阅以下代码。

class edge {
private:
    int destinationVertex;     /*!< ::vertex.id of destination vertex in graph */
public:
    /**
     * Counstructor for edge.
     */
    edge (int ver) : destinationVertex(ver) {
    }

    friend std::ostream& operator<<(std::ostream& a, edge const& e) {
        return a << e.destinationVertex;
    }

    /** @return value of ::destinationVertex */
    int getDestinationVertex() {
        return destinationVertex;
    }

    ~edge();
};

class graph;

class vertex {
    friend class graph;
    /** id of the vertex */
    int id;
    /** list of destinations */
    std::list<edge> list;

public:
    /**
     * Counstructor that creates an new empty vertex.
     */
    vertex(int id) : id(id)
    {
    }

    /**
     * @brief Overloading for << operator.
     * @details friend function that overloads the << operator for vertex
     *          class and defines a printing behaviour.
     */
    friend std::ostream& operator<<(std::ostream& s, vertex const& v) {
        s << v.id << "->";
        std::copy(v.list.begin(), v.list.end(), std::ostream_iterator<edge>(s, ","));
        return s;
    }

    /**
     * Linear search for a in list of edges of the vertex.
     * @param  a value to search
     * @return   true if element matches, else false
     */

    bool find(int a) {
        for(std::list<edge>::iterator it = list.begin(); it != list.end(); ++it)
        {
            if((*it).getDestinationVertex() == a)
                return true;
        }
        return false;
    }

    /**
     * Returns degree of a vertex.
     * @return number of edges in vertex
     */
    int deg() {
        return list.size();
    }

    void removeEdge(const int id) {
        /// How do i use the remove function of list to delete elements
        /// Any other way to write this function

    }
};

请参阅vertex.removeEdge(...)。我尝试过使用

list.remove(id);

但它没有用。

1 个答案:

答案 0 :(得分:1)

std::list::remove()删除所有与指定值匹配的项目。您的edge类可以从int值构造,但它没有std::list::remove()可用于比较edge对象的相等运算符。您需要实现这些运算符,否则请使用std::list::remove_if(),以便您可以使用谓词函数/ lambda进行比较。

另一方面,如果传递给int的{​​{1}}值表示传递给vertex::removeEdge()的相同类型的值,那么您可以使用相同的值您vertex::find()中已经拥有的removeEdge()中的循环逻辑。使用find()通过迭代器删除项目。

顺便说一下,您可以考虑重新编写std::list::erase()以使用带有谓词的vertex::find(),而不是使用手动循环。