【发布时间】:2021-08-21 22:26:32
【问题描述】:
我正在尝试创建图表。我将边建模为连接顶点的std::pair 以及连接这些顶点的边的权重。我通过另一个图形类插入这条边,该图形类将所有这些顶点保存为std::set。
我的做法如下:
这是顶点类:
class Vertex {
public:
friend std::ostream &operator<<(std::ostream &os, const Vertex &v);
Vertex(char c) : ID_(c) {}
bool operator==(const Vertex &rhs) const {
return (this->ID_ == rhs.ID_);
}
bool operator<(const Vertex &rhs) const {
return (this->ID_ < rhs.ID_);
}
char ID_;
std::vector<std::pair<Vertex, int>> neighbors;
};
这是包含顶点的图类:
class Graph {
public:
friend std::ostream &operator<<(std::ostream &os, const Graph &g);
Graph();
Graph(char c[]);
void insertVertex(char c);
void insertEdge(char ID1, char ID2, int weight);
protected:
std::set<Vertex> vertices_;
};
这是我的边缘插入方法:
void Graph::insertEdge(char c1, char c2, int w) {
auto it1 = vertices_.find(c1);
auto it2 = vertices_.find(c2);
auto p1 = std::make_pair(*it1, w);
if(it1 != vertices_.end())
it1->neighbors.push_back(p1); // Fails here
}
-> 运算符是返回迭代器指向的对象,还是返回类似 const 引用的对象?
【问题讨论】:
-
@JeJo 有一个构造函数可以将 char 转换为顶点,所以没问题。
-
“失败”是什么意思?
-
我的错,在那里我尝试访问迭代器指向的对象的属性时编译失败。
-
您应该在问题中包含编译错误消息。
-
请注意,
insertEdge()没有使用c2/it2来做任何有意义的事情,如果c1不存在于集合中,std::make_pair(*it1, w)是未定义的行为(it1是end迭代器)。在这段代码中根本没有理由使用*it1,请根据需要使用c1或c2。