std :: sort для получения std :: bad_alloc - PullRequest
1 голос
/ 07 февраля 2012
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;
};

Что не так с сортировкой () выше?Я получаю:

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

при вызове sort ().GDB также не дает мне ничего полезного ...

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

РЕДАКТИРОВАТЬ: Решено

Theпроблема заключалась в том, что эта строка

      return a.second >= b.second;

была изменена на

      return a.second > b.second;

1 Ответ

6 голосов
/ 07 февраля 2012

Компаратор, который вы даете 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...