Sunteți pe pagina 1din 4

Algoritmos numricos de la STL

Algoritmos numricos en la STL


Programacin Orientada a Objeto Ing. Civil en Telecomunicaciones

La Standard Template Library (STL) incluye algoritmos genricos para manipulacin de datos
copy(), sort(), find_if(), etc.

Incluye tambin algunos algoritmos numricos para procesamiento de datos en <numeric>


accumulate() inner_product() partial_sum() adjacent_difference()

Algoritmo accumulate()
accumulate(first, last, init) suma todos los valores entre los iteradores first y last a init El tipo de dato retornado debe ser concordante con el tipo de init
int a[] ={1, 2, 3, 4, 5}; cout << accumulate(a, a + 5, 0); cout << accumulate(a, a + 5, 0.0);

Algoritmo accumulate()
Equivalente a
template <class In, class T> T accumulate(In first, In last, T init) { while (first != last) { init = init + *first; ++first; } return init; }

Algoritmo accumulate()
Acumulador init puede ser una constante o una variable
int a[] = {1, 2, 3, 4, 5}; double s1 = 0; s1 = accumulate(a, a + 5, s1); int s2 = accumulate(a, a + 5, s2); /* Error: s2 no tiene valor inicial */ float s3 = 0; accumulate(a, a + 5, s3); /* Error: valor retornado no es usado */

Algoritmo accumulate()
accumulate(first, last, init, op) aplica la operacin op a todos los valores entre los iteradores first y last, con init como valor inicial
op

puede ser cualquier operacin binaria Cmo pasar funciones como argumento?
En C: punteros a funciones En C++: objetos funcin (Function objects)

2012 Mario Medina C.

Algoritmo accumulate()
int a[] ={1, 2, 3, 4, 5}; cout << accumulate(a, a + 5, 1, multiplies<int>());

Algoritmo accumulate()
Equivalente a
template <class In, class T, class BinOp> T accumulate(In first, In last, T init, BinOp op) { while (first != last) { init = op(init, *first); ++first; } return init; }

Ejemplo imprime 1*1*2*3*4*5=120 Ejemplo usa un objeto funcin que multiplica enteros: multiplies<int>()

Objetos funcin (Function Objects)


Es un objeto diseado para ser usado como una funcin
Redefinen el operador () Pueden ser usados en plantillas en vez de

Objetos funcin (Function Objects)


Ejemplo de funcin objeto
struct objFunc { int operator()(int a){ return a; } } miObjFunc; int x = miObjFunc(0);

punteros a funciones Definidos en <functional> Usadas en algoritmos genricos de comparacin, numricos y de transformacin

Objetos funcin (Function Objects)


Funciones aritmticas
plus<T>() minus<T>() multiplies<T>() divides<T>() modulus<T>() negates<T>()

Algoritmo inner_product()
inner_product(first, last, first2, init) calcula el producto interno de los contenedores que comienzan con first y first2
Valor inicial del producto interno es init Contenedores no tienen porqu ser iguales o

Funciones de comparacin
greater<T>() equal_to<T>() not_equal_to<T>() greater_equal<T>() less_equal<T>() less<T>()

Funciones logicas
logical_and<T>() logical_or<T>() logical_not<T>()

Adaptadores
not1<T>() not2<T>()

del mismo tipo


P.E., un vector<int> y una list<double>

2012 Mario Medina C.

Algoritmo inner_product()
Equivalente a
template <class In, class In2, class T> T inner_product(In first, In last, In2 first2, T init) { while (first != last) { init = init + (*first)*(*first2); ++first; ++first2; } return init; }

Algoritmo inner_product()
Nmero de elementos a procesar dado por last first
Si segunda secuencia tiene menos de last

first elementos, genera error al tiempo de ejecucin Si segunda secuencia tiene ms de last first elementos, elementos sobrantes no son usados

Algoritmo inner_product()
inner_product(first, last, first2, init, op1, op2) aplica la operacin op2

Algoritmo inner_product()
Equivalente a
template <class In, class In2, class T, class BinOp1, class BinOp2> T inner_product(In first, In last, In2 first2, T init, BinOp1 op1, BinOp2 op2) { while (first != last) { init = op1(init,op2(*first, *first2)); ++first; ++first2; } return init; }

a los elementos apuntados por los iteradores, y luego aplica la operacin op1 entre ese resultado y el valor inicial init
Extensin de funcin anterior

Algoritmo partial_sum()
partial_sum(first, last, result)

Algoritmo partial_sum()
Equivalente a
template <class In, class Out> Out partial_sum(In first, In last, Out result) { val = *first++; *result++ = val; while (first != last) { val = val + *first++; *result++ = val; } return result; }

calcula las sumas parciales de los elementos entre los iteradores first y last, y los almacena a partir del iterador
result Retorna un iterador a la posicin siguiente al ltimo elemento almacenado

2012 Mario Medina C.

Algoritmo partial_sum()
partial_sum(first, last, result, op) aplica la operacin op en forma secuencial a los elementos entre los iteradores first y last, y los almacena a partir del iterador result
Retorna un iterador a la posicin siguiente al

Algoritmo partial_sum()
int val[] = {1, 2, 3, 4, 5}; int result[5]; partial_sum(val, val + 5, result); /* result[] es {1, 3, 6, 10, 15} */ partial_sum(val, val + 5, result, multiplies<int>()); /* result[] es {1, 2, 6, 24, 120} */

ltimo elemento almacenado binaria de dos argumentos

Operacin op puede ser cualquier operacin

Algoritmo adjacent_difference()
adjacent_difference(first, last, result) calcula la diferencia entre elementos consecutivos entre los iteradores first y last, y los almacena a partir del iterador result
Retorna un iterador a la posicin siguiente al

Algoritmo adjacent_difference()
Equivalente a
template <class In, class Out> Out adjacent_difference(In first, In last, Out result) { prev = *first++; *result++ = prev; while (first != last) { val = *first++; *result++ = val - prev; prev = val; } return result; }

ltimo elemento almacenado


El primer elemento es copiado sin

modificaciones

Algoritmo adjacent_difference()
adjacent_difference(first, last, result, op) aplica la operacin op en forma secuencial a elementos consecutivos entre los iteradores first y last, y los almacena a partir del iterador result
Retorna un iterador a la posicin siguiente al ltimo

Algoritmo adjacent_difference()
int val[] = {1, 2, 3, 5, int result[7]; adjacent_difference(val, /* result[] es {1, 1, 1, adjacent_difference(val, multiplies<int>()); /* result[] es {1, 2, 6, */ 9, 11, 12}; val + 7, result); 2, 4, 2, 1} */ val + 7, result, 15, 45, 99, 132}

elemento almacenado
Operacin op puede ser cualquier operacin binaria

de dos argumentos

2012 Mario Medina C.

S-ar putea să vă placă și