2010-01-08 21 views
5

Digamos que hay una lista de enteros [1,2,3,4,5] y una función de mapa que multiplica cada elemento por 10 y devuelve lista modificada como [10,20,30,40,50], sin modificar la lista original. Cómo se puede hacer esto de manera eficiente en C++.¿Cómo crear una función de mapa en C++?

+0

¿Es esta tarea? –

+0

Lo siento ... He usado transform y for_each, no pude recordarlo en este momento, estaba buscando el cuarto parámetro en for_each pensando que como transform :( – yesraaj

Respuesta

17

He aquí un ejemplo:

#include <vector> 
#include <iostream> 
#include <algorithm> 

using namespace std; 

int multiply(int); 

int main() { 
    vector<int> source; 
    for(int i = 1; i <= 5; i++) { 
    source.push_back(i); 
    } 

    vector<int> result; 
    result.resize(source.size()); 
    transform(source.begin(), source.end(), result.begin(), multiply); 

    for(vector<int>::iterator it = result.begin(); it != result.end(); ++it) { 
     cout << *it << endl; 
    } 
} 

int multiply(int value) { 
    return value * 10; 
} 
3

Si puede usarlo, probablemente la mejor idea es utilizar una función en la biblioteca de plantillas estándar.

Por ejemplo, es posible que desee comprobar for_each o transform, que básicamente hacen precisamente eso.

4

sólo publicar esto para ilustrar el uso de un funtor en transformar en lugar de una función global:

#include <cstdlib> 
#include <iostream> 
#include <algorithm> 
#include <functional> 
#include <iostream> 

using namespace std; 

struct MulBy : public std::unary_function<int, int> 
{ 
    MulBy(int v) : v_(v) {} 
    int operator()(int lhs) const 
    { 
     return lhs * v_; 
    } 
private: 
    int v_; 
}; 

int main() 
{ 
    int incoming[5] = {1, 2, 3, 4, 5}; 
    int result[5] = {0, 0, 0, 0, 0}; 
    transform(&incoming[0], &incoming[5], &result[0], MulBy(10)); 
    copy(&result[0], &result[5], ostream_iterator<int>(cout, " ")); 
    return 0; 
} 
0
#include <iostream> 
    #include <algorithm> 
    #include <vector> 
    #include <functional> 
    using namespace std; 

    struct MulBy : public std::unary_function<int, int> 
    { 
     MulBy(int v) : v_(v) {} 
     int operator()(int lhs) const 
     { 
      return lhs * v_; 
     } 
    private: 
     int v_; 
    }; 
    int main() 
    { 
     vector<int> ListOfNumber; 
     ListOfNumber.push_back(1); 
     ListOfNumber.push_back(2); 
     ListOfNumber.push_back(3); 
     ListOfNumber.push_back(4); 
     ListOfNumber.push_back(5); 
     vector<int> ListResult; 
     ListResult.resize(ListOfNumber.size()); 

     //Produces a new list 
     transform(ListOfNumber.begin(),ListOfNumber.end(),ListResult.begin(),MulBy(10)); 
    copy(ListOfNumber.begin(),ListOfNumber.end(),ostream_iterator<int>(cout,"\t")); 
     //Modifies the original list 
    transform(ListOfNumber.begin(),ListOfNumber.end(),ListOfNumber.begin(),MulBy(10)); 
    copy(ListResult.begin(),ListResult.end(),ostream_iterator<int>(cout,"\t")); 
     cin.get(); 
    } 
10

A lo largo de las líneas de @darids respuesta, pero C++ 03 (actual en el momento de la publicación original):

#include <vector> 
#include <algorithm> 
#include <functional> 

std::vector<int> src; 
std::vector<int> dst; 

std::transform(src.begin(), src.end(), 
       std::back_inserter(dst), 
       std::bind1st(std::multiplies<int>(), 10)); 
+0

Gracias por esta respuesta. Sugiero agregar las directivas include necesarias para mayor claridad. – buttonupbub

+0

C++ actual sería utilizar una lambda en lugar de bind1st. – sv90

+0

@ sv90 seguro, el tiempo y C++ se han movido desde que publiqué esta respuesta. – msandiford

Cuestiones relacionadas