Скажем, есть список целых чисел [1,2,3,4,5] и функция карты, которая умножает каждый элемент на 10 и возвращает измененный список как [10,20,30,40,50] без изменения исходного список. Как это можно сделать эффективно на С++.
Как создать функцию карты в С++?
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
Спасибо за этот ответ. Я предлагаю добавить необходимые директивы включения для ясности.
- person buttonupbub; 26.11.2017
Текущий C++ будет использовать лямбда вместо bind1st.
- person sv90; 27.11.2017
@ sv90 точно, время и С++ продвинулись с тех пор, как я опубликовал этот ответ!
- person clstrfsck; 27.11.2017
Я публикую это только для иллюстрации использования функтора в преобразовании, а не глобальной функции:
#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