Ordinamento dell'array di stringhe in cpp usando std: sort
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
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.
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()).