在向量中查找元素并将其删除
Find element in a vector and remove it
我有一个向量,其中包含一组指向图中边缘的指针。我应该删除边缘,但在运行此代码时出现错误。我尝试做的是找到我正在寻找的边缘的索引,以便我可以从列表中删除该边缘。
错误:
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)
}
}
因为无效输入会导致未定义的行为。
相关文章:
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 从矢量中删除元素后出现隔离错误
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- C++映射不删除元素
- 如何从标准::元组中删除元素?
- 在动态数组中添加/删除C++元素
- 如何通过比较彼此的成员从QStringList中删除元素
- 如何修复从矢量中删除元素的错误?
- 从 std::set 中删除元素,同时在 C++17 中迭代该元素
- 使用remove_if从矢量中删除元素
- 用C++从三维矢量中删除元素
- 从对象数组中删除元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- C++ - 按自定义数据类型向量的值删除元素
- 从任意容器中廉价删除元素的惯用方法?
- 从数组中删除元素不起作用的函数
- 删除元素 BST
- 从向量中删除元素时未处理的异常