[英]std::vector of objects and sorting results in segmentation faults
我靜靜地坐在這個問題上幾個小時了,找不到解決方案。 我嘗試擺脫一些自定義數組類,並希望將它們更改為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的默認構造函數構造!!)。
現在停留在如何解決問題上。 我在這里做錯了什么? 在問這里之前,我一直在閱讀其他許多有關stackoverflow的問題,然后在這里和那里進行更改,但沒有辦法解決問題。 故障。 據我所知,我沒有插入任何Null對象(在循環中進行了測試),因此我的代碼中肯定還有另一個缺陷。 認為將其更改為指針向量是一項安靜而輕松的任務,但現在看起來似乎更加復雜...
請,有人在這個問題上幫助我。 非常感謝!
您的比較器是錯誤的:
std::sort
與比較器中的qsort不同。 您只需要返回與小於操作符相同的值即可。 例如
class BaseClusterComparator {
public:
bool operator() (const BaseCluster * a, const BaseCluster * b) const {
return a->getScore() < b->getScore();
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.