我已经安静地坐在这个问题上几个小时了,找不到解决方案。我试图摆脱一些自定义数组类,并希望将它们更改为 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());
根本不排序,我在 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;
我有一种感觉,由于向量的保留/调整大小,存在 NULL 对象(使用 BaseClass 的默认构造函数构造?!)。
现在我被困在如何解决这个问题上。我在这里做错了什么?在问here之前,我一直在阅读许多其他相关的stackoverflow问题,然后在这里和那里进行更改,但没有办法摆脱困境。故障。据我所知,我没有插入任何空对象(在循环中测试过),所以我的代码中肯定存在另一个缺陷。认为更改为指针向量是一项安静的简单任务,但现在似乎更复杂了......
拜托,有人帮我解决这个问题。提前非常感谢!