30 votes

Est-ce que std :: sort devrait fonctionner avec la fonction lambda dans c ++0x / c ++11?

J'ai essayé d'utiliser la fonction lambda avec sort , mais j'obtenais des erreurs de "défaut de segmentation". J'ai réussi à simplifier le code comme suit:

 #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;
}
 

Je compile et exécute ce code dans Ubuntu 11.04 (x64) en utilisant

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

Il imprime un grand nombre de paires du formulaire (large_integer, 1008), un couple de (0, 1008) et se termine avec "Erreur de segmentation".

35voto

ybungalobill Points 31467

Le prédicat de comparaison doit retourner un bool: true si a <b et false sinon. Modifiez l'instruction de retour en:

   return a < b;
 

Ne le confondez pas avec les fonctions de comparaison à 3 voies de style C.

16voto

Kerrek SB Points 194696

Le prédicat est censé implémenter un ordre simple et faible. Votre plage est également désactivée si vous souhaitez trier le tout. (J'ai raté que c'était intentionnel.) Donc, dans l'ensemble, nous recherchons quelque chose comme ça:

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

Ou même:

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

Le prédicat par défaut pour le tri est std::less<T> , ce qui fait exactement ce que fait le lambda.

7voto

Dave S Points 11381

Le prédicat pour std::sort ne prend pas le -1,0,1 Java, mais veut à la place que vous renvoyiez un booléen qui répond à la question "Le premier argument est-il inférieur au deuxième?" , qui est utilisé pour classer faiblement les éléments. Étant donné que -1 est une valeur non nulle, elle est considérée comme vraie par l'algorithme de tri et entraîne une panne de l'algorithme.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X