Озадачивающий SegFault, включающий алгоритм сортировки STL

Я пытаюсь воссоздать программу в Столбце 15 программирования жемчуга с помощью STL. Я пытаюсь создать суффиксный массив с помощью строки и вектора индексов. Я записываю список слов, которые я считал в строке, названной входом, который действует как список слов, разделенных, '' который я считал из stdin в начале программы. Все работает как ожидалось, пока я не добираюсь до части сортировки кода. Я хотел бы использовать алгоритм сортировки STL, но я полностью озадачен в отказе seg, который я, кажется, создаю.

Я имею:

vector<unsigned int> words;

и глобальная переменная

string input;

Я определяю свое пользовательское, сравнивают функцию:

bool wordncompare(unsigned int f, unsigned int s) {
  int n = 2;

  while (((f < input.size()) && (s < input.size()))
         && (input[f] == input[s])) {
    if ((input[f] == ' ') && (--n == 0)) {
      return false;
    }

    f++;
    s++;
  }

  return true;
}

Когда я выполняю код:

sort(words.begin(), words.end());

Программа выходит гладко.

Однако, когда я выполняю код:

sort(words.begin(), words.end(), wordncompare);

Я генерирую SegFault глубоко в STL.

Код следа GDB похож на это:

#0  0x00007ffff7b79893 in std::string::size() const () from /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6
#1  0x0000000000400f3f in wordncompare (f=90, s=0) at text_gen2.cpp:40
#2  0x000000000040188d in     std::__unguarded_linear_insert<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, unsigned int, bool (*)(unsigned int, unsigned int)> (__last=..., __val=90, __comp=0x400edc <wordncompare(unsigned int, unsigned int)>)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1735
#3  0x00000000004018df in std::__unguarded_insertion_sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1812  
#4  0x0000000000402562 in std::__final_insertion_sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1845
#5  0x0000000000402c20 in std::sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>)
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:4822
#6  0x00000000004012d2 in main (argc=1, args=0x7fffffffe0b8) at text_gen2.cpp:70

У меня есть подобный код в другой программе, но в той программе я использую вектор вместо вектора. Ни за что в жизни я не могу выяснить то, что я делаю неправильно.Спасибо!

5
задан just_wes 14 March 2010 в 03:22
поделиться

1 ответ

Скорее всего, ваш компаратор не удовлетворяет строгому слабому порядку; например, это нарушает транзитивность, потому что существует некоторое кольцо значений, такое что A . Я не вижу этого в голове, но собираюсь смотреть на это еще несколько минут.

10
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: