Как создать функцию карты в С++?

Скажем, есть список целых чисел [1,2,3,4,5] и функция карты, которая умножает каждый элемент на 10 и возвращает измененный список как [10,20,30,40,50] без изменения исходного список. Как это можно сделать эффективно на С++.


person yesraaj    schedule 08.01.2010    source источник
comment
Извините... Я использовал преобразование и for_each, сейчас не мог вспомнить, я искал четвертый параметр в for_each, думая, что это преобразование :(   -  person yesraaj    schedule 08.01.2010


Ответы (4)


Вот пример:

#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;
}
person jason    schedule 08.01.2010

В соответствии с ответом @darids, но С++ 03 (актуально на момент исходного сообщения):

#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));
person clstrfsck    schedule 09.01.2010
comment
Спасибо за этот ответ. Я предлагаю добавить необходимые директивы включения для ясности. - person buttonupbub; 26.11.2017
comment
Текущий C++ будет использовать лямбда вместо bind1st. - person sv90; 27.11.2017
comment
@ sv90 точно, время и С++ продвинулись с тех пор, как я опубликовал этот ответ! - person clstrfsck; 27.11.2017

Если вы можете ее использовать, вероятно, лучшей идеей будет использование функции из стандартной библиотеки шаблонов.

Например, вы можете проверить for_each или transform, которые в основном делают именно это.

person Edan Maor    schedule 08.01.2010

Я публикую это только для иллюстрации использования функтора в преобразовании, а не глобальной функции:

#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;
}
person John Dibling    schedule 08.01.2010