Sdílet prostřednictvím


qsort_s

Provede rychlé řazení.Verze qsort s vylepšení zabezpečení, jak je popsáno v Funkce zabezpečení v CRT.

void qsort_s(
   void *base,
   size_t num,
   size_t width,
   int (__cdecl *compare )(void *, const void *, const void *),
   void * context
);

Parametry

  • base
    Začátek cílové pole.

  • num
    Velikost pole prvků.

  • width
    Prvek velikost v bajtech.

  • compare
    Porovnání funkce.První argument je context ukazatele.Druhý argument je ukazatel key pro hledání.Třetí argument je ukazatel na prvek pole, která se má porovnat s key.

  • context
    Ukazatel na kontext může být objekt, který compare potřebuje přístup k rutině.

Poznámky

qsort_s Funkce implementuje algoritmus řazení rychle seřadit pole num prvky, každý z width bajtů.Argument base je ukazatel na základě pole, které mají být seřazeny.qsort_sToto pole přepíše prvky tříděny.Argument compare je ukazatel na uživatelem zadaný rutina, který porovnává dva prvky matice a vrátí hodnotu určující jejich vztah.qsort_svolání compare rutinní jednou nebo vícekrát během řazení, předáním ukazatele při každém volání dva prvky pole:

compare( context, (void *) & elem1, (void *) & elem2 );

Rutinní musí porovnat prvky a vrátí jednu z následujících hodnot:

Návratová hodnota

Description

< 0

elem1 menší než elem2

0

elem1odpovídáelem2

> 0

elem1 větší než elem2

Pole je seřazeno vzestupně, definované funkce porovnání.Chcete-li seřadit pole v sestupném pořadí, zpětně smyslu "větší než" a "menší než" ve funkci porovnání.

Pokud jsou předány neplatné parametry funkce, vyvolán neplatný parametr obslužné rutiny, jak je popsáno v Ověření parametru.Pokud je povoleno zpracování pokračovat, pak vrátí a errno je nastavena na EINVAL.Další informace naleznete v tématu errno, _doserrno, _sys_errlist, and _sys_nerr.

Chybové podmínky

klíč

base

porovnat

NUM

Šířka

Kód chyby

NULL

any

any

any

any

EINVAL

any

NULL

any

!= 0

any

EINVAL

any

any

any

any

<= 0

EINVAL

any

any

NULL

any

any

EINVAL

qsort_s má stejné chování jako qsort , ale context parametr a nastaví errno.Předáním context parametr funkce porovnání můžete použít ukazatel objekt pro přístup k funkci objektu nebo jiné informace, není k dispozici prostřednictvím ukazatele prvek.Přídavek context je parametr qsort_s bezpečnější, protože context slouží k zamezení chyb vícenásobný zavedena pomocí statické proměnné zpřístupnit sdílené informace compare funkce.

Požadavky

Rutina

Požadované záhlaví

qsort_s

<stdlib.h> a <search.h>

Další informace o kompatibilitě, viz Kompatibilita v úvodu.

Knihovny: Všechny verze běhových knihoven Funkce knihovny CRT.

Příklad

Následující příklad ukazuje, jak použít context parametr qsort_sfunkce.context Parametr je snazší provést řazení vláken.Nepoužívejte statické proměnné, které mají být synchronizovány pro zajištění bezpečnosti podprocesu předat jiné context parametr při každém řazení.V tomto příkladu se používá objekt národního prostředí jako context parametr.

// crt_qsort_s.cpp
// compile with: /EHsc /MT
#include <stdlib.h>
#include <stdio.h>
#include <search.h>
#include <process.h>
#include <locale.h>
#include <locale>
#include <windows.h>
using namespace std;

// The sort order is dependent on the code page.  Use 'chcp' at the
// command line to change the codepage.  When executing this application,
// the command prompt codepage must match the codepage used here:

#define CODEPAGE_850

#ifdef CODEPAGE_850
// Codepage 850 is the OEM codepage used by the command line,
// so \x00e1 is the German Sharp S in that codepage and \x00a4
// is the n tilde.

char *array1[] = { "wei\x00e1", "weis", "annehmen", "weizen", "Zeit",
                   "weit" };
char *array2[] = { "Espa\x00a4ol", "Espa\x00a4" "a", "espantado" };
char *array3[] = { "table", "tableux", "tablet" };

#define GERMAN_LOCALE "German_Germany.850"
#define SPANISH_LOCALE "Spanish_Spain.850"
#define ENGLISH_LOCALE "English_US.850"

#endif

#ifdef CODEPAGE_1252
   // If using codepage 1252 (ISO 8859-1, Latin-1), use \x00df
   // for the German Sharp S and \x001f for the n tilde.
char *array1[] = { "wei\x00df", "weis", "annehmen", "weizen", "Zeit",
                   "weit" };
char *array2[] = { "Espa\x00f1ol", "Espa\x00f1" "a", "espantado" };
char *array3[] = { "table", "tableux", "tablet" };

#define GERMAN_LOCALE "German_Germany.1252"
#define SPANISH_LOCALE "Spanish_Spain.1252"
#define ENGLISH_LOCALE "English_US.1252"

#endif

// The context parameter lets you create a more generic compare.
// Without this parameter, you would have stored the locale in a
// static variable, thus making sort_array vulnerable to thread
// conflicts.

int compare( void *pvlocale, const void *str1, const void *str2)
{
    char s1[256];
    char s2[256];
    strcpy_s(s1, 256, *(char**)str1);
    strcpy_s(s2, 256, *(char**)str2);
    _strlwr_s( s1, sizeof(s1) );
    _strlwr_s( s2, sizeof(s2) );

    locale& loc = *( reinterpret_cast< locale * > ( pvlocale));

    return use_facet< collate<char> >(loc).compare(s1, 
       &s1[strlen(s1)], s2, &s2[strlen(s2)]);

}

void sort_array(char *array[], int num, locale &loc)
{
    qsort_s(array, num, sizeof(char*), compare, &loc);
}

void print_array(char *a[], int c)
{
   for (int i = 0; i < c; i++)
     printf("%s ", a[i]);
   printf("\n");
       
}

void sort_german(void * Dummy)
{
   sort_array(array1, 6, locale(GERMAN_LOCALE));
}

void sort_spanish(void * Dummy)
{   
   sort_array(array2, 3, locale(SPANISH_LOCALE));     
}

void sort_english(void * Dummy)
{   
   sort_array(array3, 3, locale(ENGLISH_LOCALE));   
}

int main( )
{

   int i;
   HANDLE threads[3];
   
   printf("Unsorted input:\n");
   print_array(array1, 6);
   print_array(array2, 3);
   print_array(array3, 3);


   // Create several threads that perform sorts in different
   // languages at the same time. 

   threads[0] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_german , 0, NULL));
   threads[1] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_spanish, 0, NULL));
   threads[2] = reinterpret_cast<HANDLE>(
                 _beginthread( sort_english, 0, NULL));

   for (i = 0; i < 3; i++)
   {
      if (threads[i] == reinterpret_cast<HANDLE>(-1))
      {
         printf("Error creating threads.\n");
         exit(1);
      }
   }

   // Wait until all threads have terminated.
   WaitForMultipleObjects(3, threads, true, INFINITE);
  
   printf("Sorted output: \n");

   print_array(array1, 6);
   print_array(array2, 3);
   print_array(array3, 3);

  
  
}

Výstup ukázky

Unsorted input:
weiß weis annehmen weizen Zeit weit 
Español España espantado 
table tableux tablet 
Sorted output: 
annehmen weiß weis weit weizen Zeit 
España Español espantado 
table tablet tableux

Ekvivalent v rozhraní .NET Framework

Sort

Viz také

Referenční dokumentace

Vyhledávání a třídění

bsearch_s

_lsearch_s

qsort