Умножьте векторные элементы со скалярным значением с использованием STL
Вопрос
Привет, я хочу (умножать, добавлять, и т. Д.) Вектор по скалярной цене, например myv1 * 3
Я знаю, что могу сделать функцию с Forloop, но есть ли способ сделать это с помощью функции STL? Что-то вроде функции {Algorithm.h :: Trance}?
Решение
Да, используя 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>
Другие советы
Если вы можете использовать valarray
вместо а vector
, Он имеет встроенные операторы для выполнения скалярного умножения.
v *= 3;
Если вы должны использовать vector
, вы можете действительно использовать transform
сделать работу:
transform(v.begin(), v.end(), v.begin(), _1 * 3);
(Предполагая, что у вас есть что-то похожее на Boost.lambda Это позволяет легко создавать анонимные объекты функции, как _1 * 3
:-П)
Решение MORDERN C ++ для вашего вопроса.
std::vector<double> myarray;
double myconstant{3.3};
std::transform(myarray.begin(), myarray.end(), myarray.begin(), [myconstant](auto& c){return c*myconstant;});
Я знаю это не STL, сколько вы хотите, но это то, что вы можете адаптировать, так как возникают разные потребности.
Ниже приведен шаблон, который вы можете использовать для расчета; «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 */
Кроме того, это не «безопасная» функция, вы должны сделать тип / проверять значение и т. Д. До его использования.
Я думаю for_each
Очень доставляется, когда вы хотите пересечь вектор и манипулировать каждый элемент в соответствии с некоторыми шаблон, в этом случае достаточно простого лямбда:
std::for_each(myv1.begin(), mtv1.end(), [](int &el){el *= 3; });
Обратите внимание, что любая переменная, которую вы хотите захватить для использования функции лямбда (скажем, что вы, например, хотели умножить с помощью некоторого заранее определенного скалярного), переходит в кронштейн в качестве ссылки.