std::sort для получения std::bad_alloc
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;
};
Что не так с sort() выше? Я получаю:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
когда я вызываю sort(). GDB также не дает мне ничего полезного...
Я предполагаю, что проблема связана с тем, что я нахожусь в классе?
РЕДАКТИРОВАТЬ: Решено
Проблема была в этой строке
return a.second >= b.second;
изменился на
return a.second > b.second;
1 ответ
Компаратор, который вы даете std::sort
должен установить строгий слабый порядок. Это означает:
- Для всех х это не тот случай, когда сравнивают (х, х) (нерефлексивность).
- Для всех 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
,