对通过引用传递的 2d 向量进行排序
Sorting 2d vector passed by reference
我实现了Prim的算法。它返回一个std::vector<std::vector<int>>
(它是向量的向量:[顶点,顶点,权重])。结果是正确的,但是当我将其与实验室人员的结果进行比较时,有时会有这样的差异:
我有一个权重为 2 的边缘4-1
,他有一个权重为 2 + 的边缘1-4
,他的结果就像0-something
、0-something
、1-something
、2-something
,我的是4-something
、1-something
、2-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]);
}
您还应该以在第一个条目相等时使用第二个条目的方式编写比较谓词。
相关文章:
- 将值指定给向量(2D)的向量中的某个位置
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 如何在C++或OpenCV子矩阵中的2D子向量上使用OpenACC?
- 哪个更快:在 1d 向量中按字符串搜索还是在 2d 向量中按向量搜索?
- 分配具有 2D 向量大小的变量的内存
- 根据组件 1、2(和 3)对空间 (2D/3D) 向量进行排序
- 在统一内存 CUDA C/C++ 中分配 2D 向量
- 索引 2D 向量时'Reference to type const..'编译错误
- 查找 2D 向量的位置,该向量是类C++的一个元素
- 如何在 C++ 中的函数中传递 2D 向量的子向量
- 为 2D 向量类创建标量乘法运算符
- 无法使用push_back将整数插入1D/2D向量
- 如何将列附加到现代C 中的2D向量
- 如何声明和初始化一个特定尺寸向量的2D数组
- 如何计算 2D 数组中每行的总和并放置在向量中
- 在不使用递归的情况下求解所有 2D 字符串向量组合?(C++)
- 在类中创建向量(2D 数组)的向量 - Error:C++ 需要所有声明的类型说明符
- 在C++中使用向量的向量(2D 向量)表示邻接列表
- 将向量(2D数组)的向量重置为零