【发布时间】:2021-09-02 03:02:20
【问题描述】:
我正在尝试实现一个应用程序,该应用程序将在图中找到所有最小生成树,但我不熟悉 C++。
我有一个向量 G,其元素为 vector<pair<int, edge>> G; 边缘是:
#define edge pair<int, int>
现在我有一个问题,因为我想要另一个带有指向向量 G 元素的指针的向量 S。然后我想对该向量 S 进行排序(按权重增加),但我不想对向量 G 的原始元素进行排序(我只是希望向量 G 保持不变)。
这可能吗?
tl;博士:
向量 G:
向量 S: pointers_to_elements_of_G -------> 已排序
【问题讨论】:
-
std::vector<std::reference_wrapper<std::pair<int, edge>>> S;? -
如果您尝试一些东西,编写一些代码,然后,无论您的代码有多么损坏,您都可以发布它,我们可以帮助修复它,这会容易得多。目前,这个问题似乎只是基于一个错误的前提。如果将指针存储在第二个容器中并对该容器进行排序,则不会影响原始向量的顺序。
-
无关:不要
#define edge。制作正确的 typedef:using edge = std::pair<int, int>; -
用不同的、更刻薄的话来说:是的,这是可能的。这是否回答你的问题? ;)。您将需要一个用于
std::sort的自定义比较器,它不比较指针而是比较它们指向的对象。重新排列S中的指针不会改变G中的顺序。 -
我在第二个向量 (S) 上使用 Kruskal 算法,它可以工作,但是在找到最小生成树中包含的所有边之后,我需要更改原始图。我需要向每个边缘添加布尔值,以告知是否包含边缘。像这样的东西:edge1:YES,edge2:YES,edge3:NO,edge4:YES。我当前的 Vector S 正在使用 Vector G 元素的副本。现在我想使用指针,因为它会让我的应用程序更快。我没有发布我的应用,因为它太大了,我只想知道那件事。