如何在 C++ 中对向量组元素进行排序?

Posted

技术标签:

【中文标题】如何在 C++ 中对向量组元素进行排序?【英文标题】:How can I sort a vector group elements in c++? 【发布时间】:2017-01-12 09:42:10 【问题描述】:

我正在尝试搜索邻接矩阵中的最小元素。 为此,我想逐行对元素进行排序。

为了优化排序,我只想对这个向量的重要元素进行排序,如下形式:

[0,   5,   9,   7]
[inf, 0,   6,   3]
[inf, inf, 0,  12]
[inf, inf, inf, 0]

排序后的矩阵必须是这样的:

[0,   5,   7,   9]
[inf, 0,   3,   6]
[inf, inf, 0,  12]
[inf, inf, inf, 0]

我正在尝试使用 std::vector<int> 和 C++ sort 函数,作为这种形式,但它失败了。

当我尝试使用 6 个元素执行时,程序显示错误:

malloc(): memory corruption (fast): 0x000000000cb12490

对于其他数量,有时会产生类似的错误或返回 -1

我的矩阵是用vector<vector<int> >实现的

//Sort matrix row to row
for(int i = 0; i < numnodes; i++)
    sort(matrix[i].begin()+1+i, matrix[i].end());
    if(matrix[i][i+1] < minimal)
        minimal = matrix[i][i+1];
        row = i;
    
`

我该如何解决这个问题?

【问题讨论】:

这可能和这个问题一样吗? ***.com/questions/36777834/… @ChristianHackl 不。我想对向量从 i 位置到结尾进行排序 什么是inf“它失败了”是什么意思? 它到底在哪里失败了?正如我所见,您的代码会生成您的预期结果 创建一个minimal reproducible example。并描述程序是如何“失败”的。 【参考方案1】:

您应该为超出范围的访问添加保护。当 i + 1 超出matrix[i] 的范围时,您看到的错误很可能是由matrix[i][i+1] 引起的。我相信这应该是一个固定版本的代码。

//Sort matrix row to row
for(int i = 0; i + 1 < matrix[i].size() && i < numnodes; i++)
    sort(matrix[i].begin()+1+i, matrix[i].end());
    if(matrix[i][i+1] < minimal)
        minimal = matrix[i][i+1];
        row = i;
    

【讨论】:

这明智地忽略了最后一行,OP 正在对空序列进行排序。我假设numnodes == matrix.size() == matrix[i].size(),所以循环条件可以简化为i + 1 &lt; numnodes 我只是尝试了一下,但 6 个元素继续失败 @Caleth 这也是我的假设,但由于我缺乏上下文,决定安全地进​​行 @AlmuHS 您能否提供我们能够重现问题的最小示例。我很确定你给我们的代码没有问题 现在也有 10 个元素失败

以上是关于如何在 C++ 中对向量组元素进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

我如何按类属性对C++向量数组进行排序[重复]

在向量c ++中对复数进行排序

在循环中对向量进行排序

在c ++中对向量的向量进行排序

排序函数在 C++ 算法中是如何工作的,以及如何改进这段代码? [关闭]

在 C++ 中对结构数组进行排序