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

时间:2016-03-16 19:20:09

标签: c++ data-structures

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

错误:

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;
};

非常感谢任何帮助

1 个答案:

答案 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