std ::对象向量和排序导致分段错误

时间:2012-07-08 01:51:09

标签: c++ sorting segmentation-fault stdvector

我几个小时以来一直坐在这个问题上,找不到解决办法。我试图摆脱一些自定义数组类,并希望将它们更改为std :: vector。

我有一个像这样声明的类成员:

std::vector<BaseCluster *> baseClusters;

在类构造函数中,我没有将向量初始化为特定大小。我保持原样,没有初始化。之前,我尝试初始化if到一定的大小(以获得一些性能并防止许多重新分配),但这使我在循环中访问元素时遇到问题(例如,将它们打印出来)。我想这是由于使用默认构造函数(类型为BaseCluster)初始化对象为NULL-Objects ??

然而,在循环中,我用这样的对象填充向量

baseClusters.push_back(new BaseCluster(current, score));

循环完成后,我会对一些不感兴趣的对象进行清理:

for (unsigned int i = 0; i < baseClusters.size(); i++) {
    // --- testing   
    if (baseClusters.at(i) == NULL) {
       wcout << i << ". object is NULL" << endl;
    }
    if (
      ((BaseCluster *) baseClusters.at(i))->getNode()->getSuffixedDocumentsCount() < minimalGroupSize
    ) {
        baseClusters.erase(baseClusters.begin() + i);
    }

    if (i >= noMoreBaseClustersThan) {
        baseClusters.erase(baseClusters.begin() + i);
    }
}

现在我对矢量进行排序(应该按分数降序排序),这里有一个问题:

1。)使用排序为

sort(baseClusters.begin(), baseClusters.end()); 

根本没有排序,也是我实施的&#34;运营商&lt;&#34;或&#34;运营商&gt;&#34;在BaseCluster类中根本没有触及。运营商是公开的,看起来像这样。

bool operator< (const BaseCluster * rhs) const {
    return m_score < rhs->m_score;
}

bool operator> (const BaseCluster * rhs) const {
    return m_score > rhs->m_score;
}

2。)使用谓词/仿函数

class BaseClusterComparator {
public:
    bool operator() (const BaseCluster * a, const BaseCluster * b) const {
        wcout << "BaseClusterComparator" << endl;
        wcout << a->getScore() << " <> " << b->getScore() << endl;
        if (a->getScore() > b->getScore()) {
            return -1;
        } else if (a->getScore() < b->getScore()) {
            return 1;
        } else {
            return 0;
        }
    }
};

班级成员getScore看起来像这样

float
BaseCluster::getScore() const {
    return m_score;
}

并使用

执行排序
sort(baseClusters.begin(), baseClusters.end()), BaseClusterComparator());
在对大约60 - 70个对象进行排序后尝试访问getScore()方法时,

会导致分段错误。

Program received signal SIGSEGV, Segmentation fault.
0x00000000004773ec in BaseCluster::getScore (this=0x2ef1) at algorithm/BaseCluster.cpp:44
44      return m_score;

我觉得由于保留/调整向量大小,有NULL对象(使用BaseClass的默认构造函数构造?!)。

现在我仍然坚持如何解决问题。我在这做错了什么?在问这里之前,我一直在阅读许多其他相关的stackoverflow问题,然后通过改变这里和那里,但没有办法离开seg。故障。据我所知,我没有插入任何Null-Objects(在循环中测试过),所以我的代码中必然存在另一个缺陷。认为这是一个安静的简单任务,改为指针向量,但现在似乎更复杂......

拜托,有人帮我解决这个问题。非常感谢提前!

1 个答案:

答案 0 :(得分:1)

你的比较器错了:

std::sort与比较器中的qsort不同。您只需返回与less运算符相同的内容。例如

class BaseClusterComparator {
public:
    bool operator() (const BaseCluster * a, const BaseCluster * b) const {
        return a->getScore() < b->getScore();
    }
};