Archive for the ‘STL’ Category
Coisas simples de se fazer em C++ que alguns ainda complicam #2 – Aplicar funções aos elementos de um contêiner STL
Bom, essa é a segunda parte da série e vamos falar sobre uma maneira simples de aplicar uma função à todos os elementos de um contêiner STL (vector, list, deque, stack, etc) ou à todos os elementos de uma std::string.
Para isso usaremos a função std::transform().
No nosso primeiro exemplo, usaremos transform() com uma função que retorna o quadrado de um número.
#include <iostream> //cout
#include <algorithm> //transform()
#include <vector>
using namespace std;
int quadrado(int num)
{
return num * num;
}
int main()
{
vector<int> vetor;
for (int i = 0; i < 10; i++) vetor.push_back(i);
transform(vetor.begin(), //iterator pro incio do range desejado
vetor.end(), //iterator para o fim do range
vetor.begin(), //iterator para conteiner o destino
quadrado //função a ser aplicada
);
//imprime os valores.
vector<int>::iterator it;
for (it = vetor.begin(); it != vetor.end(); it++) {
cout << *it << ' ';
}
cout << endl;
return 0;
}
Saida:
0 1 4 9 16 25 36 49 64 81
No segundo exemplo, mostramos como converter uma std::string para minúsculo com transform():
#include <iostream> //cout
#include <algorithm> //transform()
#include <string>
#include <cctype> //tolower, toupper
using namespace std;
int main()
{
string url = "HTTP://MURILO.WORDPRESS.COM";
transform(url.begin(), url.end(), //origem
url.begin(), //destino
::tolower); //função tolower da <cctype> (necessário ::)
cout << url << endl;
return 0;
}
Saída
https://murilo.wordpress.com
transform() também aceita funções com dois parâmetros, para que possamos aplicar uma função aos valores de dois contêineres e armazenarmos em um:
#include <iostream> //cout
#include <algorithm> //transform()
#include <complex>
#include <vector>
using namespace std;
complex<int> func(int real, int imag)
{
return complex<int>(real, imag);
}
int main()
{
vector<int> real; //parte real
vector<int> imag; //parte imaginaria
real.push_back(1);
real.push_back(3);
real.push_back(152);
imag.push_back(5);
imag.push_back(8);
imag.push_back(12);
vector< complex<int> > complexo(3); //reserva 3 posicoes
transform(real.begin(), real.end(), //origem
imag.begin(), //origem do segund
complexo.begin(), //destino
func //função
);
vector< complex<int> >::iterator it;
for (it = complexo.begin(); it != complexo.end(); it++) {
cout << *it << endl;
}
return 0;
}
Saída:
(1,5)
(3,8)
(152,12)
Até a próxima.
Ver a primeira parte da série.