c++ - 对象的 std::vector 和排序导致段错误

标签 c++ sorting segmentation-fault stdvector

我已经安静地解决这个问题几个小时了,但找不到解决方案。我试图摆脱一些自定义数组类,并希望将它们更改为 std::vector。

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

std::vector<BaseCluster *> baseClusters;

在类构造函数中,我没有将 vector 初始化为特定大小。我保留原样,未初始化。之前,我尝试将 if 初始化为特定大小(以获得一些性能并防止多次重新分配),但这让我无法访问循环中的元素(例如,将它们打印出来)。我猜这是由于使用默认构造函数(类型为 BaseCluster)将对象初始化为 NULL 对象造成的??

但是,在一个循环中,我用这样的对象填充 vector

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);
    }
}

现在我对 vector 进行排序(应该按分数降序排序),这里我遇到了一个问题:

1.) 使用排序为

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

根本不排序,我在 BaseCluster 类中实现的“operators<”或“operator>”也根本没有被触及。运算符是公开的,看起来像这样。

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;

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

现在我陷入了如何解决这个问题。我在这里做错了什么?在问这里之前,我一直在阅读许多其他相关的 stackoverflow 问题,然后在这里和那里进行更改,但没有办法摆脱 seg。故障。据我所知,我没有插入任何空对象(在循环中测试过),所以我的代码中肯定还有另一个缺陷。认为将指针 vector 更改为一个安静的简单任务,但现在看起来更复杂......

拜托,任何人都可以帮助我解决这个问题。提前致谢!

最佳答案

你的比较器是错误的:

std::sort 不像比较器中的 qsort。您只需返回与小于运算符相同的值。例如

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

关于c++ - 对象的 std::vector 和排序导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11380080/

相关文章:

c++ - 使用自定义表达式类 boost Spirit 表达式解析器

php - 如何从网页向串口发送数据?

c++ - boolean 值 c++ 的格式化输出

java - Java 中的多线程排序动画

c - SIGSEGV 的 sig 处理问题

c++ - 函数结束后出现段错误 (C++)

c - 如何查找C代码中的段错误?

c++ - 如何在 C/C++ 中使用带有 OpenSSL 的静态链接

javascript - 将对象字面量转换为排序数组

c++ - 对指针列表进行排序 C++ - 没有匹配的函数错误