Почему std :: sort вызывает ошибку сегментации в этом коде? - PullRequest
5 голосов
/ 08 августа 2011

Может кто-нибудь объяснить, почему сортировка ниже вызывает ошибки seg?Это известная ошибка с g ++ (вектор сортировки указателей)?Я компилирую с g ++ 4.5.2.

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

typedef vector<int> A;
bool face_cmp(const A *x, const A *y) {
  return x != y;
}

int main(int argc, char* argv[]) {

  vector<A *> vec;
  for (int i=0; i<100; i++) {
    vec.push_back( new vector<int>(i%100, i*i) );
  }

  vector<A *>::iterator it;
  sort(vec.begin(), vec.end(), face_cmp);

  return EXIT_SUCCESS;
}

Компиляция на кодовой панели дает:

/usr/local/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../include/c++/4.1.2/debug/safe_iterator.h:240:
    error: attempt to decrement a dereferenceable (start-of-sequence)     
    iterator.

Objects involved in the operation:
iterator "this" @ 0x0xbf4b0844 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIPPN15__gnu_debug_def6vectorIiSaIiEEEN10__gnu_norm6vectorIS7_SaIS7_EEEEENS4_IS7_SB_EEEE (mutable iterator);
  state = dereferenceable (start-of-sequence);
  references sequence with type `N15__gnu_debug_def6vectorIPNS0_IiSaIiEEESaIS3_EEE' @ 0x0xbf4b0844
}

Спасибо за все быстрые ответы.Исходная функция компа была:

if (x == y) return false;
if (x->size() < y->size()) return true;
else if (x->size() > y->size()) return false;
else {
  for (register int i=0; i<x->size(); i++) {
    if ((*x)[i] < (*y)[i]) return true;
  }
  return false;
}

Я просто изменил первую строку и удалил остальные.Но оказывается, что он также страдает от отсутствия строгого слабого порядка (я забыл случай, если (* x) [i]> (* y) [i]).Я, наверное, должен был опубликовать всю функцию для начала.Тем не менее, еще раз спасибо !!

Ответы [ 4 ]

14 голосов
/ 08 августа 2011

Функция сравнения должна определять строгий слабый порядок, что означает, что a < b и b < a не могут быть оба истинными.Ваша функция сравнения не имеет этого свойства.

Он не определяет никаких отношений "до-после", поэтому неудивительно, что алгоритм, использующий это свойство, не работает должным образом.

8 голосов
/ 08 августа 2011

Третий аргумент std::sort должен быть функцией (или функциональным объектом), такой, что если compare(a, b) равно true, то compare(b, a) должно быть false, но ваш не такой.Итак, ваша программа UB и может дать любой результат.

7 голосов
/ 08 августа 2011

Нет, ваш код неверен.Функции сравнения для std :: sort должны использовать <или эквивалентно, использование! = Неверно.Вероятно, вы хотите это </p>

bool face_cmp(const A *x, const A *y) {
  return *x < *y;
}
1 голос
/ 08 августа 2011

Определите функцию сравнения как

bool face_cmp(const A *x, const A *y) {
  return x < y;
}
...