Ordinamento dell'array di stringhe in cpp usando std: sort

Sep 27 2020

Sto cercando di ordinare array (sì, non vettori) di stringhe, seguendo alcuni suggerimenti di siti come questo . Questo è il codice che ho scritto finora, ma stampa sempre questo lungo errore (che non ha risultati su google). Come si puo aggiustare?

#include <algorithm>
#include <cstring>
#include <iostream>
//qsort(names, n, 15, (int (*)(const void *, const void *))strcmp);



int main()
{
    std::cout << "hi";
    char arr[3][6];
    strcpy(arr[0], "hello"), strcpy(arr[1], "hillo"), strcpy(arr[2], "hallo");
    std::sort(arr, arr + 3, [](char const *lhs,
                           char const *rhs) { return strcmp(lhs, rhs) < 0; });
    //qsort(arr, 3, 20, (int (*)(const void *, const void *))strcmp);
    for (int i = 0; i < 3; ++i)
        std::cout << arr[i] << '\n';
}

Risposte

1 eerorika Sep 27 2020 at 17:18

Questa è la parte rilevante del messaggio di errore:

errore: l'array deve essere inizializzato con un inizializzatore racchiuso tra parentesi graffe

Il che sfortunatamente non è molto chiaro, ma proviene dall'implementazione dell'ordinamento. Quindi, rivediamo le precondizioni dell'algoritmo:

std::sortè implementato scambiando elementi. In quanto tale, richiede che gli elementi siano scambiabili. Gli elementi del tuo array sono array. Gli array non sono scambiabili. Pertanto un array di array non è ordinabile.

utilizzando il tipo "stringa" funzionerà qui?

L'utilizzo std::stringfunzionerà. È sostituibile. Non avrai nemmeno bisogno di una funzione di confronto personalizzata perché è persino comparabile.

cosa rende gli array non scambiabili e altri tipi scambiabili

Lo scambio viene implementato dall'inizializzazione (e dall'assegnazione) del movimento. Le regole del linguaggio dicono che l'array non è inizializzabile per lo spostamento (né è assegnabile). Sapendo questo, vedi se il messaggio di errore ha un senso.

PavanKumarR Jan 07 2021 at 18:46

Non è possibile ordinare array di array utilizzando la funzione di ordinamento incorporata. Puoi attraversare l'array di stringhe e ordinare ogni stringa (str) usando sort(str.begin(), str.end()).