Должен ли std :: sort работать с лямбда-функцией в c ++ 0x / c ++ 11? - PullRequest
30 голосов
/ 14 октября 2011

Я пытался использовать лямбда-функцию с sort, но получал ошибки «Ошибка сегментации». Мне удалось упростить код до следующего:

#include <iostream>
#include <algorithm>

int main()
{
  const int len = 18;
  int intArr[len];
  for (int i=0;i<len;i++) intArr[i]=1000+i;
  // The following is expected to sort all but the last element of the array
  std::sort(intArr, intArr + len -1, [](int a, int b)
    {
      std::cout<<"("<<a<<", "<<b<<")\n";
      return (a<b?-1:(a>b?1:0));
    });
  return 0;
}

Я компилирую и запускаю этот код в Ubuntu 11.04 (x64), используя

g++ -std=gnu++0x test2.cpp && ./a.out.

Он печатает множество пар вида (large_integer, 1008), пару (0, 1008) и выходит с «Ошибка сегментации».

Ответы [ 3 ]

34 голосов
/ 14 октября 2011

Предикат сравнения должен возвращать bool: true, если a return a < b; Не путайте это с 3-сторонними функциями сравнения в стиле C.

16 голосов
/ 14 октября 2011

Предикат должен реализовывать простой, слабый порядок. Также ваш диапазон отключен, если вы хотите отсортировать все целиком. (Я пропустил, что это было сделано намеренно). Итак, в общем, мы ищем что-то вроде этого:

std::sort(intArr, intArr + nelems, [](int a, int b){ return a < b; });

Или даже:

std::sort(intArr, intArr + nelems);

Предикат по умолчанию для сортировки - std::less<T>, что в точности соответствует лямбде.

7 голосов
/ 14 октября 2011

Предикат для std::sort не принимает Java-подобный -1,0,1, но вместо этого хочет, чтобы вы возвращали логическое значение, отвечающее на вопрос «Является ли первый аргумент меньше второго аргумента?», Которое используется для слабо упорядочить элементы. Поскольку -1 является ненулевым значением, оно считается истинным алгоритмом сортировки, и это приводит к сбою алгоритма.

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