我正在尝试用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);
但它没有用。
答案 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()
,而不是使用手动循环。