Eu escrevi um código em C++ há um tempo atrás e quando olhei hoje vi como a legibilidade mudou desde o C++11.
Neste código eu vi algumas coisas interessantes. Ele serve bem de exemplo para alguns tipos de codificação
Vamos ver agora cada um deles.
O algoritmo que eu implementei é bem simples. Ele itera em uma std::string de entrada e copia somente os caracteres não numéricos para a string de saída.
Ex: "12asew3d45ddf678ee9 0" => "1234567890"
Essa é a versão mais simples de todas, de implementar e de entender.
https://gist.github.com/thiagomg/29f45db0e8fc0ea6166e
Nós estamos usando o for_each com um Functor numerical_appender para que ele adicione na string de saída somente os caracteres numéricos.
É uma implementação trivial. Para cada caractere da entrada, o operator() será chamado.
Aqui nós temos uma diferença básica. Ao invés de receber uma string, o algoritmo trabalha com iteradores somente e dessa forma suporta qualquer tipo de vetor, podendo ser uma string, vector, list, etc...
https://gist.github.com/thiagomg/07b7ace3c40be2865c67
C++ 11 e o lambda vieram facilitar a nossa vida e melhorar a legibilidade realmente.
Vamos fazer a implementação concreta da nossa função:
https://gist.github.com/thiagomg/5b2d06a923d1a8af6fed
Bem mais simples!
Temos agora uma função encadeada dentro de get_numeric e fazendo o filtro.
Agora temos uma surpresa interessante. Vejamos a diferença dela para a versão concreta.
https://gist.github.com/thiagomg/d9877aaac2f86b7b1759
Note que ela é quase igual à versão concreta. Temos o template de diferença e o auto no lambda. Fácil, não acha?
No C++ 14 (desde o C++ 11, na verdade) temos um método novo na STL chamado copy_if. Esse método faz basicamente o que o std::copy faz, porém tendo um predicado para definir se o caractere será copiado.
https://gist.github.com/thiagomg/ade42c7a04e70c448760
Simples, não?
Uma outra forma de implementar esse mesmo método seria usar o iterador com predicado. Fica para quem tiver curiosidade:
http://simplycpp.com/2015/10/13/iterator-com-predicado-o-que-e-isso/
Neste código eu vi algumas coisas interessantes. Ele serve bem de exemplo para alguns tipos de codificação
- Codificação concreta
- Codificação genérica
- Codificação concreta com C++ moderno
- Codificação genérica com C++ moderno
Vamos ver agora cada um deles.
O algoritmo
O algoritmo que eu implementei é bem simples. Ele itera em uma std::string de entrada e copia somente os caracteres não numéricos para a string de saída.
Ex: "12asew3d45ddf678ee9 0" => "1234567890"
Codificação concreta
Essa é a versão mais simples de todas, de implementar e de entender.
https://gist.github.com/thiagomg/29f45db0e8fc0ea6166e
Nós estamos usando o for_each com um Functor numerical_appender para que ele adicione na string de saída somente os caracteres numéricos.
É uma implementação trivial. Para cada caractere da entrada, o operator() será chamado.
Codificação genérica
Aqui nós temos uma diferença básica. Ao invés de receber uma string, o algoritmo trabalha com iteradores somente e dessa forma suporta qualquer tipo de vetor, podendo ser uma string, vector, list, etc...
https://gist.github.com/thiagomg/07b7ace3c40be2865c67
Codificação concreta com C++ moderno
C++ 11 e o lambda vieram facilitar a nossa vida e melhorar a legibilidade realmente.
Vamos fazer a implementação concreta da nossa função:
https://gist.github.com/thiagomg/5b2d06a923d1a8af6fed
Bem mais simples!
Temos agora uma função encadeada dentro de get_numeric e fazendo o filtro.
Codificação genérica com C++ moderno
Agora temos uma surpresa interessante. Vejamos a diferença dela para a versão concreta.
https://gist.github.com/thiagomg/d9877aaac2f86b7b1759
Note que ela é quase igual à versão concreta. Temos o template de diferença e o auto no lambda. Fácil, não acha?
C++ 14 - STL
No C++ 14 (desde o C++ 11, na verdade) temos um método novo na STL chamado copy_if. Esse método faz basicamente o que o std::copy faz, porém tendo um predicado para definir se o caractere será copiado.
https://gist.github.com/thiagomg/ade42c7a04e70c448760
Simples, não?
Uma outra forma de implementar esse mesmo método seria usar o iterador com predicado. Fica para quem tiver curiosidade:
http://simplycpp.com/2015/10/13/iterator-com-predicado-o-que-e-isso/
Referências
Fonte:
- https://github.com/SimplyCpp/examples/blob/master/numeric.cpp
Referências:
- http://www.cplusplus.com/reference/algorithm/copy_if/
- http://www.cplusplus.com/reference/algorithm/for_each/
Comentários
Postar um comentário