在类定义中具有用户定义谓词的set对象

时间:2018-05-03 16:37:43

标签: c++ algorithm c++11

我是C ++初学者,我试图实现Kruskal算法来查找加权(连接)无向图的最小生成树。

我首先创建了一个.mat-sort-header-container { display:flex; justify-content:center; } 类。

WeightedGraph

最初我在上面定义了名为class WeightedGraph { private: int V; map<pair<int, int>, int> w_map; public: // constructors and other member functions. }; 的私有数据成员,用于保存每条边的权重。也就是说,如果w_map是图形边缘,则{u, v}会提供对此边缘权重的引用。

Kruskal算法的一个步骤是通过非减少权重的顺序对图中的所有边进行排序。

据我了解,w_map[{u, v}]仅按键排序(使用默认的map运算符或使用用户定义的二元谓词)。 <无法直接按map排序。mapped_value如果我错了,请纠正。

一个选项是定义和使用上面的w_map set<pair<pair<int, int>, int>(让它命名为w_set),为它提供我们自己的谓词,以便每个元素{{1 } a根据w_map(其权重)的值复制到w_set

所以如果我们的谓词是这样的话:

a.second

然后我们可以按如下方式定义bool Comparer(const pair<pair<int, int>, int> &a, const pair<pair<int, int>, int> &b) { return a.second < b.second; }

w_set

并在成员函数中使用它来访问私有成员set<pair<pair<int, int>, int>, decltype(Comparer)*> w_set(Comparer); 的迭代器。

但是

我在想,如果不是

,该怎么办?
  • 使用w_map存储边缘和重量。
  • 定义一个成员函数,仅返回一个边缘按重量排序的集合。

我们直接使用与map相同类型的一组作为w_set的数据成员。在这种情况下,在每个元素插入时,集合将按预期排序。

所以我做的就是这个:

WeightedGraph

但我收到以下错误:

class WeightedGraph
{
private:
    int V;
    set<pair<pair<int, int>, int>, decltype(Comparer)*>w_sorted(Comparer);

public:
    // constructors and other member functions.
};

无法识别Unknown type name 'SortByWeight' 作为SortByWeight参数传递给comp构造函数的内容。

老实说,我不知道自己做错了什么。我想我会搞一些非常明显的东西(可能有范围),但我无法弄清楚是什么。

0 个答案:

没有答案