8
votes

Comment créer une fonction de carte en C ++?

Disons qu'il existe une liste d'entiers [1,2,3,4,5] et une fonction de carte qui multiplie chaque élément avec 10 et renvoie une liste modifiée comme [10,20,30,40,50 ans], avec modifier la liste d'origine. Comment cela peut être fait efficacement en C ++.


1 commentaires

Désolé ... j'ai utilisé Transform et pour la recherche, je ne pouvais pas le rappeler pour le moment, je cherchais un quatrième paramètre dans la pensée de la pensée comme transformation :(


6 Réponses :


4
votes

Si vous pouvez l'utiliser, la meilleure idée est probablement d'utiliser une fonction dans la bibliothèque de modèles standard.

Par exemple, vous voudrez peut-être consulter pour_each ou Transform , qui fait essentiellement cela.


0 commentaires

20
votes

Voici un exemple: xxx


0 commentaires

4
votes

Je ne pose que cela pour illustrer à l'aide d'un foncteur de transformation plutôt que d'une fonction globale: xxx


0 commentaires

0
votes
   #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();
    }

0 commentaires

11
votes

Le long des lignes de @Darids répond, mais C ++ 03 (courant au moment de l'article 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));


3 commentaires

Merci pour cette réponse. Je suggère d'ajouter les directives nécessaires à la clarté.


Current C ++ serait d'utiliser une Lambda au lieu de BIND1ST.


@ SV90 à coup sûr, le temps et C ++ ont été déplacés depuis que j'ai posté cette réponse!



0
votes

Ceci est ma mise en œuvre pour une méthode de carte Array, inspirée directement de JavaScript xxx

peut-être que cela sera utile pour quelqu'un d'autre, toujours, si Les fonctions sont une meilleure approche, allez-y et utilisez-les.


0 commentaires