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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts