Bug no sort? <algorithm> [RESOLVIDO]

1. Bug no sort? <algorithm> [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 28/07/2020 - 02:44h

Percebi que ele não funciona adequadamente com acentos, nem mesmo declarando locale! BUG ou eu não sei fazer alguma coisa para Ordenar acentos?
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

int main() {
std::setlocale(LC_ALL, ""); // Adicionei isso mas é indiferente COM ou SEM nada muda!
std::vector<std::string> Simple {"Zebra", "Xuxa", "Ç", "Érica", "Ásia"};

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

for(size_t x = 0; x < Simple.size(); x++)
std::cout << Simple[x] << '\n';
}

No Exemplo acima ele não Coloca as palavras acentuadas no início, antes de X ou Z e o mesmo problema com o Ç


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/07/2020 - 16:35h

A comparação de std::strings por padrão compara caráter a caráter (ou byte a byte). Você pode usar um objeto do tipo std::locale para entregar uma comparação diferente.

O exemplo do cppreference.com é quase perfeito para você (ele usa std::wstring em vez de std::string, mas isso é fácil de adaptar). Veja https://en.cppreference.com/w/cpp/locale/collate.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)

3. Re: Bug no sort? <algorithm> [RESOLVIDO]

Nick Us
Nick-us

(usa Slackware)

Enviado em 28/07/2020 - 22:28h

paulo1205 escreveu:
A comparação de std::strings por padrão compara caráter a caráter (ou byte a byte).

Eu não sabia disso! Mas estou começando a entender melhor o fucionamento de Wide Caracteres, tanto em C, qto em C++. Estou estudando o funcionamento deles, e achei muito interessante, ao descobrir que os Wide tem espaço para 2 Caracteres, em cada campo! Eu montei até um exemplo usando wchar em C. E wstring em C++.

Mas fiz confusão e fiquei perdido porque qdo montei o exemplo foi para funcionar maiúscula e minúscula com acentos. Mas no fundo Ordenar é a mesma coisa! Ou seja, se vou trabalhar com acentos preciso usar Wide e não caracter normal, visto que óbviamente é mais fácil comparar 1 campo do que criar um algorítmo para comparar 2 campos separados!

O exemplo do cppreference.com é quase perfeito para você (ele usa std::wstring em vez de std::string, mas isso é fácil de adaptar). Veja https://en.cppreference.com/w/cpp/locale/collate.

É perfeito sim, até porque é bem diferente do que eu montei. Eu não conhecia o imbue vou ler sobre ele.
No exemplo que eu montei eu converti string para wstring usando wstring_convert, trabalhei nelas e converti de wstring de volta, esse exemplo é um pouco diferente, o que farei é juntar os 2 e tirar deles o que ficar melhor!

Também usei o sort de forma mais simples, não sabia que podia declarar o locale dentro dele! Gostei dessa forma desse exemplo!

As vezes eu esqueço de consultar esse site também! Consulto muito o cplusplus, google, eu tenho esse anotado em meus favoritos mas sempre esqueço dele! Terei mais atenção!








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts