对通过引用传递的 2d 向量进行排序

Sorting 2d vector passed by reference

本文关键字:向量 2d 排序 引用      更新时间:2023-10-16

我实现了Prim的算法。它返回一个std::vector<std::vector<int>>(它是向量的向量:[顶点,顶点,权重])。结果是正确的,但是当我将其与实验室人员的结果进行比较时,有时会有这样的差异:

我有一个权重为 2 的边缘4-1,他有一个权重为 2 + 的边缘1-4,他的结果就像0-something0-something1-something2-something,我的是4-something1-something2-something

我知道这不是错误,但他吹毛求疵,所以我想我会对这个向量进行排序。

首先,如果 [0] 个大于 [1] 个,我将通过交换这两个顶点标签来对内部向量进行排序。

然后,我将通过检查某个向量中的 [0] 是否大于其他向量中的 [0] 来对它们进行排序。我有这个代码:

void undirected_graph::mySort(std::vector<std::vector<int>>& input)
{
for (auto row = input.begin(); row != input.end(); ++row)
{
if (row[0] > row[1])
{
std::swap(row[0], row[1]);
}
}
std::sort(input.begin(), input.end(), [](const std::vector< int >& a, const std::vector< int >& b) { return a[0] < b[0]; });
}

我用mySort(mst)调用该方法(类型std:vector<std::vector<int>>)

当它指向我得到std::swap时的错误是:vector iterator not dereferencable

我应该以某种方式传递向量,还是应该更改此方法代码中的某些内容?

auto row是一个迭代器。该迭代器的operator[]不会在指向的元素上调用相应的运算符,而是返回迭代器在给定操作数递增时将指向的元素。因此,语句row[1]可能会尝试取消引用向量的end()迭代器,这是不可能的。您要做的是:

if ((*row)[0] > (*row)[1])
{
std::swap((*row)[0], (*row)[1]);
}

您还应该以在第一个条目相等时使用第二个条目的方式编写比较谓词。