簡體   English   中英

std :: vector和排序結果導致分割錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM