【问题标题】:Segmentation fault while sorting the vector based on ordering induced by a matrix基于矩阵诱导的排序对向量进行排序时出现分段错误
【发布时间】:2013-07-24 09:34:37
【问题描述】:

我编写了如下代码。我收到分段错误错误。调试器显示错误来自“some_order”。我检查了一个特定示例的变量值。取 n = 26:然后, Var = {0,...,25} 这意味着传递给 'some_order' 的 u 和 v 必须在 (0-25) 范围内,但我得到其中一个的一些大值,例如 7785654或-1549259(类似的东西)。我不明白为什么。分段错误是不可避免的。

//TNT: template numeric toolkit
#include "tnt.h"  
//contains includes to all files in http://math.nist.gov/tnt/tnt_doxygen/files.html
//all other necessary stl and standard c++ libaray includes are there     

class global_data{
public:
  static TNT::Matrix<double>* Value_matrix;

};
TNT::Matrix<double>* global_data::Value_matrix = NULL;


bool some_order(const int& u ,const int& v) {
      return (*global_Data::Value_matrix)[v][u] == 0.0;
}

void some_function(int n){
    std::vector<int> Var(n);
    for(int i=0; i<n; i++){
        Var[i] = i;
    }
    std::sort(Var.begin(), Var.end(), some_order );
}

int main(){
    //assume we have n;       
    //nxn matrix, initialised with 0.0 
    global_data::Value_matrix = new TNT::Matrix<double>(n,n,0.0) ;
    //global_data::Value_matrix is then filled with values
    some_function(n); 
    delete[] global_data::Value_matrix
}

【问题讨论】:

  • 您的排序函数应该返回两个参数中的哪一个更大,但它似乎什么也没做。
  • 您的some_function 没有任何可观察的结果。它创建一个向量并对其进行排序,然后将其丢弃。
  • @jcoder :这是基于 Value_matrix 值的不同排序
  • @TemplateRex 我没有发布整个代码,这是无关紧要的。下面还有更多代码。
  • 我认为您没有发布部分代码,这对于找到解决问题的方法至关重要。

标签: c++ sorting stl


【解决方案1】:

这种类型的错误几乎总是由于排序函数 不满足严格弱排序的要求,如 标准要求的。你确定 1) some_order(a, b) && some_order(b, c) 暗示 some_order(a, c),并且 2) some_order( a, b ) 暗示 !some_order(b, a)? (顺便说一句,它 在我看来不像,但我真的不明白它是什么 正在做。)

【讨论】:

  • +1 在这个测试用例中,它似乎总是返回true,这意味着所有元素都应该排在所有其他元素之前。
  • 这可能是可能的原因。我会调查这件事。
  • @JoachimIsaksson 更重要的是,这意味着a &lt; bb &lt; a,这违反了严格弱排序的要求。 (一些实现实际上会在运行时检测到这一点。)
【解决方案2】:

std::sort 假设比较函数模拟Strict Weak Ordering

  • 不自反:some_order(u, u) 返回false
  • 反对称:some_order(u, v) 暗示!some_order(v, u)(两者都可能为假,在这种情况下uv 是等价的)
  • 传递:some_order(u, v) == truesome_order(v, w) == true 暗示 some_order(u, w) == true

这取决于你的global_Data矩阵的内容你的some_order()是否可以和std::sort一起使用

- irreflexive: diagonal cannot have 0.0 on it
- anti-symmetric: if an entry has 0.0 then the transpose element has no 0.0
- transitive: if `global_Data[u, v]` and `global_Data[v, w]` have 0.0 then `global_Data[u, w]` also has that.

先验似乎是一个非常严格的限制,您可能需要检查它。

【讨论】:

  • 您的第二个条件是错误的:some_order(u, v) 暗示 !some_order(v, u),但两者都可以为假(!some_order(u, v) &amp;&amp; !some_order(v, u) 定义了等价关系)。
  • std::sort 不会使用 some_order(u, u) 对吧?为什么在排序时将元素与自身进行比较。 Is 只是严格弱排序定义的一部分
  • @JamesKanze tnx,已修复!
  • @UtkristAdhikari 依赖于std::sort的实现。许多快速排序实现将对象与自身进行比较;这样做通常比在最里面的循环之一中添加额外的条件更便宜、更简单。
  • @UtkristAdhikari 当然,序列可能包含多个具有相同值(或在同一个等价类中)的对象。
猜你喜欢
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2020-11-04
  • 2013-11-12
相关资源
最近更新 更多