2012-02-07 3 views
1
class RankList { 
public: 
    struct RankListComparator { 
    bool operator()(const std::pair<boost::numeric::ublas::vector<double>, double>& a, const std::pair<boost::numeric::ublas::vector<double>, double>& b) { 
     return a.second >= b.second; 
    } 
    }; 

    void push_back(boost::numeric::ublas::vector<double> features, double label) { 
    m_list.push_back(std::pair<boost::numeric::ublas::vector<double>, double>(features, label)); 
    } 

    void sort() { 
    std::sort(m_list.begin(), m_list.end(), RankListComparator()); 
    } 

protected: 
    std::vector<std::pair<boost::numeric::ublas::vector<double>, double> > m_list; 
}; 

Что не так с этим видом() выше? Я получаю a:std :: sort get a std :: bad_alloc

terminate called after throwing an instance of 'std::bad_alloc' 
    what(): std::bad_alloc 

когда вызываю сортировку(). gdb не дает мне ничего полезного ни ...

Я предполагаю, что проблема связана с тем, что я нахожусь в классе?

EDIT: решаемые

Проблема была эта линия

 return a.second >= b.second; 

изменено на

 return a.second > b.second; 

ответ

6

Компаратор вы даете std::sort должны установить strict weak ordering. Это означает:

  • Для всех х это не так, чтобы сравнить (x, x) (нерефлексивность).
  • Для всех x ≠ y, если сравнивать (x, y), то сравнивать не следует (y, x) (асимметричный).
  • Для всех x, y и z, если сравнить (x, y) и сравнить (y, z), то сравнить (x, z) (транзитивность).
  • Для всех x, y и z, если x несравнимо с y, а y несравнимо с z, то x несравнимо с z (транзитивность эквивалентности).

Ваш оригинальный компаратор не является неотъемлемым: compare(x, x) - это правда. Использование такого компаратора приводит к неопределенному поведению, которое вы испытали из первых рук как std::bad_alloc.

Смежные вопросы