Intereting Posts
Как обеспечить соблюдение ключевого слова «переопределить»? Создание QList Динамика модели C ++ в QML Как сделать графики / графики (например, линейные графики, гистограммы, круговые диаграммы) и т. Д. В C ++, Qt, QML, Blackberry 10 Cascades Beta 3 SDK? что является лучшим способом освобождения памяти в c ++ Не загружен драйвер QSQLITE – где добавить плагины драйвера базы данных qt Гарантировано ли, что стандартные библиотеки библиотеки C ++ вызывают заменяемые новые функции? Почему Direct3D не восстановится после отключения монитора в Windows XP? Передача ссылки rvalue на опорный пареметр const lvalue tokenizing строку данных в вектор structs? C ++: Указывает ли указатель на std :: string преобразование содержимого? Опция компилятора строки с нулевым завершением для gcc ожидание streamа до тех пор, пока не будет выполнено условие fft2 в MATLAB vs dft в сравнении скорости OpenCV C ++ Выберите двоичный файл C в соответствии с окружающей средой различные типы инициализации в C ++

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

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

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

     std::transform(myv1.begin(), myv1.end(), myv1.begin(), std::bind(std::multiplies(), std::placeholder::_1, 3)); 

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

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

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

     v *= 3; 

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

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

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

    Просто: если вы можете иметь свои данные в массиве с фиксированным размером (значения с плавающей запятой [N]), вы можете использовать встроенные функции SSE, чтобы сделать это быстрее, поскольку оно будет умножать последовательное значение float aa time (4).

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

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

     template _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 очень подходит, когда вы хотите пересечь вектор и манипулировать каждым элементом в соответствии с некоторым шаблоном, в этом случае достаточно простой lambda:

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

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