在向量中查找元素并将其删除

Find element in a vector and remove it

本文关键字:删除 元素 向量 查找      更新时间:2023-10-16

我有一个向量,其中包含一组指向图中边缘的指针。我应该删除边缘,但在运行此代码时出现错误。我尝试做的是找到我正在寻找的边缘的索引,以便我可以从列表中删除该边缘。

错误:

error: cannot convert '__gnu_cxx::__normal_iterator<Edge**,    
std::vector<Edge*> >' to 'int' in initialization
   int i = find(edgeList.begin(),edgeList.end(), *e);

我知道这与从 Edge 到 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;
};

任何帮助都非常感谢

std::find函数返回的不是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)
  }
}

因为无效输入会导致未定义的行为。