Умножьте векторные элементы на скалярное значение, используя STL - PullRequest
34 голосов
/ 07 октября 2010

Привет! Я хочу (умножить, добавить и т. Д.) Вектор по скалярному значению, например myv1 * 3, я знаю, что могу сделать функцию с помощью forloop, но есть ли способ сделать это с помощью функции STL? Что-то вроде {Algorithm.h :: transform function}?

Ответы [ 5 ]

81 голосов
/ 07 октября 2010

Да, используя std::transform:

std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind(std::multiplies<T>(), std::placeholders::_1, 3));

До C ++ 17 вы могли использовать std::bind1st(), что не рекомендуется в C ++ 11.

std::transform(myv1.begin(), myv1.end(), myv1.begin(),
               std::bind1st(std::multiplies<T>(), 3));

Для заполнителей;

#include <functional> 
23 голосов
/ 07 октября 2010

Если вы можете использовать valarray вместо vector, у него есть встроенные операторы для скалярного умножения.

v *= 3;

Если вам нужно использовать vector, вы действительно можетеиспользуйте transform для выполнения работы:

transform(v.begin(), v.end(), v.begin(), _1 * 3);

(при условии, что у вас есть что-то похожее на Boost.Lambda , которое позволяет вам легко создавать объекты анонимных функций, такие как _1 * 3 :-P)

6 голосов
/ 20 января 2019

Mordern C ++ решение для вашего вопроса.

std::vector<double> myarray;
double myconstant{3.3};
std::transform(myarray.begin(), myarray.end(), myarray.begin(), [myconstant](auto& c){return c*myconstant;});
0 голосов
/ 03 января 2018

Я думаю, for_each очень уместно, когда вы хотите пройти вектор и манипулировать каждым элементом согласно некоторому шаблону, в этом случае будет достаточно простой лямбды:

std::for_each(myv1.begin(), mtv1.end(), [](int &el){el *= 3; });

обратите внимание, что любая переменная, которую выхотите захватить для использования лямбда-функции (скажем, что вы, например, хотели умножить на некоторый предопределенный скаляр), переходите в скобки в качестве ссылки.

0 голосов
/ 08 октября 2010

Я знаю, что это не STL, как вы хотите, но это то, что вы можете адаптировать по мере возникновения различных потребностей.

Ниже приведен шаблон, который вы можете использовать для расчета; 'func' - это функция, которую вы хотите выполнить: умножение, сложение и т. д .; 'parm' является вторым параметром в 'func'. Вы можете легко расширить это, чтобы использовать различные функции с большим количеством различных типов.

template<typename _ITStart, typename _ITEnd, typename _Func , typename _Value >
_ITStart xform(_ITStart its, _ITEnd ite, _Func func, _Value parm)
{
    while (its != ite) { *its = func(*its, parm); its++; }
    return its;
}
...

int mul(int a, int b) { return a*b; }

vector< int > v;

xform(v.begin(), v.end(), mul, 3); /* will multiply each element of v by 3 */

Кроме того, это не «безопасная» функция, вы должны выполнить проверку типа / значения и т. Д. Перед ее использованием.

...