Умножьте векторные элементы со скалярным значением с использованием STL

StackOverflow https://stackoverflow.com/questions/3885095

Вопрос

Привет, я хочу (умножать, добавлять, и т. Д.) Вектор по скалярной цене, например 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; });

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top