【问题标题】:How to sort pointers in vector but not sort original elements [C++]如何对向量中的指针进行排序但不对原始元素进行排序[C++]
【发布时间】:2021-09-02 03:02:20
【问题描述】:

我正在尝试实现一个应用程序,该应用程序将在图中找到所有最小生成树,但我不熟悉 C++。

我有一个向量 G,其元素为 ,它们是 weight、edgeStart、edgeDest: vector<pair<int, edge>> G; 边缘是: #define edge pair<int, int>

现在我有一个问题,因为我想要另一个带有指向向量 G 元素的指针的向量 S。然后我想对该向量 S 进行排序(按权重增加),但我不想对向量 G 的原始元素进行排序(我只是希望向量 G 保持不变)。

这可能吗?

tl;博士:

向量 G: -------> UNSORTED and CONST

向量 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 元素的副本。现在我想使用指针,因为它会让我的应用程序更快。我没有发布我的应用,因为它太大了,我只想知道那件事。

标签: c++ sorting vector


【解决方案1】:

这是一个基本示例,但可以通过替换扩展到您的用例 带边缘的第二个 int。在 c++ 中,简单的 using 语句优于宏定义:

#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
int main() {
  using pair_i = std::pair<int, int>;
  std::vector<pair_i> v {{10,1},{1,2},{2,2},{4,8}};
  std::vector<const pair_i*> v_p(v.size());
  for(int i = 0; i < v.size(); ++i)
    v_p[i] = &(v[i]);
  std::sort(v_p.begin(), v_p.end(), [&](auto& p1, auto& p2){ return std::get<0>(*p1) < std::get<0>(*p2);});
  //printing to stdout to show one is sorted and the other is untouched
  for(int i = 0; i < v.size(); ++i) {
    auto& p = v[i];
    auto& p_p = *(v_p[i]);
    std::cout << std::get<0>(p) << "," << std::get<1>(p) << ", "
              << std::get<0>(p_p) << "," << std::get<1>(p_p) << "\n";
 }
}

【讨论】:

    猜你喜欢
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多