我有一个向量,其中包含一组指向图中边的指针。 我应该删除边缘,但是当我运行此代码时出现错误。我尝试做的是找到我正在寻找的边缘的索引,这样我就可以从列表中删除边缘。
错误:
error: cannot convert '__gnu_cxx::__normal_iterator<Edge**,
std::vector<Edge*> >' to 'int' in initialization
int i = find(edgeList.begin(),edgeList.end(), *e);
据我所知,它与Edge To int的转换有关,但我无法找到解决方案。
我的方法:
void Graph::removeEdge(Edge *e)
{
Node* v = e->endpoint[0];
Node* w = e->endpoint[1];
if (this->areAdjacent(v,w) == true)
{
int i = find(edgeList.begin(),edgeList.end(), *e);
edgeList.erase(i)
}
}
图表类
class Graph : public GraphADT {
public:
// General graph methods
Node* aVertex();
void insertVertex(Node* n);
void insertEdge(Node* v, Node* w, int i = 0);
void removeVertex(Node* n);
void removeEdge(Edge* e);
std::vector<Edge*>& incidentEdges(Node* n);
Node** endVertices(Edge* e);
Node* opposite(Node* n, Edge* e);
bool areAdjacent(Node* v, Node* w);
// Methods for directed edges
bool isDirected(Edge* e);
void insertDirectedEdge(Node* v, Node* w, int i = 0);
Node* origin(Edge* e);
Node* destination(Edge* e);
// Generic methods
int numVertices();
int numEdges();
vector<Node*>& vertices();
vector<Edge*>& edges();
// Algorithms
void depthFirstTraversal(Node* n);
void breadthFirstTraversal(Node* n);
vector<Edge*> primsAlgorithm();
void dijkstrasAlgorithm(Node* n);
private:
void setAllUnvisited();
vector<Node*> verticeList;
vector<Edge*> edgeList;
};
非常感谢任何帮助
答案 0 :(得分:2)
std::find
function不是int
,而是iterator
。您可以使用auto
关键字,如评论中所述,或使用类似
std::vector<Edge*>::iterator it = find(edgeList.begin(),edgeList.end(), e);
此外,您应该在删除前检查iterator
void Graph::removeEdge(Edge *e)
{
Node* v = e->endpoint[0];
Node* w = e->endpoint[1];
if (this->areAdjacent(v,w))
{
auto it = find(edgeList.begin(),edgeList.end(), e);
if ( it != edgeList.end() )
edgeList.erase(it)
}
}
因为无效输入会导致undefined behavior。