Classificando a matriz de strings em cpp usando std: sort

Sep 27 2020

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

1 eerorika Sep 27 2020 at 17:18

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.

PavanKumarR Jan 07 2021 at 18:46

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()).