Classificando a matriz de strings em cpp usando std: sort
Estou tentando classificar matrizes (sim, não vetores) de strings, seguindo algumas sugestões de sites como este . Este é o código que escrevi até agora, mas sempre imprime este erro longo (que não tem resultados no google). Como isso pode ser consertado?
#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';
}
Respostas
Esta é a parte relevante da mensagem de erro:
erro: a matriz deve ser inicializada com um inicializador entre chaves
O que não é muito claro, infelizmente, mas não vem de dentro da implementação de classificação. Então, vamos revisar as pré-condições do algoritmo:
std::sorté implementado trocando elementos. Como tal, requer que os elementos sejam trocáveis. Os elementos do seu array são arrays. As matrizes não podem ser trocadas. Portanto, uma matriz de matrizes não é classificável.
usar o tipo "string" funcionará aqui?
Usar std::stringvai funcionar. É trocável. Você nem precisará de uma função de comparação personalizada porque ela é até comparável.
o que torna os arrays não trocáveis e outros tipos trocáveis
A troca é implementada pela inicialização (e atribuição) do movimento. As regras de linguagem dizem que o array não pode ser inicializado por movimento (nem pode ser atribuído). Sabendo disso, veja se a mensagem de erro faz algum sentido.
Você não pode classificar o array de arrays usando a função interna de classificação. Você pode percorrer a matriz de strings e classificar cada string (str) usando sort(str.begin(), str.end()).