Sortowanie znaków ciągu C ++

86

Jeśli mam ciąg znaków, czy istnieje wbudowana funkcja do sortowania znaków, czy też musiałbym pisać własne?

na przykład:

string word = "dabc";

Chciałbym to zmienić tak, aby:

string sortedWord = "abcd";

Może użycie znaku jest lepszą opcją? Jak mam to zrobić w C ++?

gprime
źródło
7
O co chodzi std::sort?
dreamlax
Zauważ, że każdy rodzaj naiwnego sortowania opartego na wartości znaków nie działa z UTF-8 - w zależności od ciągów znaków możesz chcieć wziąć pod uwagę ustawienia regionalne.
Christian Severin

Odpowiedzi:

149

W standardowej bibliotece w nagłówku znajduje się algorytm sortowania<algorithm> . Sortuje w miejscu, więc jeśli wykonasz następujące czynności, oryginalne słowo zostanie posortowane.

std::sort(word.begin(), word.end());

Jeśli nie chcesz zgubić oryginału, najpierw wykonaj kopię.

std::string sortedWord = word;
std::sort(sortedWord.begin(), sortedWord.end());
R. Martinho Fernandes
źródło
A co, jeśli chcemy, aby ciąg był sortowany w kolejności rosnącej?
The Room
3
@madhuspot domyślnie std::sortsortuje w kolejności alfabetycznej. Przypuśćmy, że to drobna literówka i chcesz de kolejność fałdowanie używać wersja std::sort, która trwa Comparejako trzeci argument i dostarczamy std::greaterzamiast domyślnego std::less. std::stringużywa tego chartypu domyślnie, więc np. std::sort(sortedWord.begin(), sortedWord.end(), std::greater<char>());- to dałoby wynik „dcba” w oryginalnym pytaniu zamiast „abcd”.
Tommy,
3
@madhuspot lub użyj std :: reverse
Vincent
15
std::sort(str.begin(), str.end());

Zobacz tutaj

dreamlax
źródło
10
To jest najlepszy sposób ... JEŚLI łańcuch używa kodowania jednobajtowego. W przeciwnym razie rozdzielisz znaki na ich bajty składowe.
Ben Voigt
2

Musisz dołączyć sortfunkcję, która znajduje się w algorithmpliku nagłówkowym, który jest standardową biblioteką szablonów w C ++.

Sposób użycia : std :: sort (str.begin (), str.end ());

#include <iostream>
#include <algorithm>  // this header is required for std::sort to work
int main()
{
    std::string s = "dacb";
    std::sort(s.begin(), s.end());
    std::cout << s << std::endl;

    return 0;
}

WYNIK:

abcd

abe312
źródło
1

Możesz użyć funkcji sort () . sort () istnieje w pliku nagłówkowym algorytmu

        #include<bits/stdc++.h>
        using namespace std;


        int main()
        {
            ios::sync_with_stdio(false);
            string str = "sharlock";

            sort(str.begin(), str.end());
            cout<<str<<endl;

            return 0;
        }

Wynik:

achklors

zrazy
źródło