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