Выполнить векторную операцию - PullRequest
2 голосов
/ 19 июля 2010

Я использую векторный контейнер для хранения массива пар.Есть ли быстрый способ умножения каждого элемента в моем векторе на некоторый скаляр без использования цикла.

Например:

  vector<double> Array(10,1);

инициализирует массив из 10 двойных чисел с начальным значением 1. Чтобы умножить этот массив на 0,5, я бы написал:

  for(unsigned int i=0; i<Array.size(); i++) 
     Array[i] = 0.5*Array[i]; 

Isтам другой путь?Я использовал valarray, который перегружает оператор '*', так что:

     Array = 0.5 * Array; 

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

Спасибо!

Ответы [ 5 ]

10 голосов
/ 19 июля 2010

Вы можете сделать это:

std::transform(Array.begin(), Array.end(), Array.begin(),
                std::bind2nd(std::multiplies<double>(), 0.5));

В ответ на получение суммы элементов:

double sum = std::accumulate(Array.begin(), Array.end(), 0.0);

В ответ на получение sqrt каждого элемента:

std::transform(Array.begin(), Array.end(), Array.begin(),
                static_cast<double (*)(double)>(std::sqrt));

Это приведение для выбора правильной перегрузки.

1 голос
/ 19 июля 2010

Подумайте об использовании std::valarray, так как это более подходящий выбор.

Существует причина, по которой стандартная библиотека предоставляет широкий выбор контейнеров.Это позволяет разработчику использовать «лошадей для курсов».

std::vector - это самый простой контейнер, и поэтому он является лучшим выбором для многих случаев.Однако для конкретных случаев добавленная функциональность другого типа контейнера может сделать этот тип лучшим выбором.Это может быть одним из таких случаев, когда числовые манипуляции с элементами массива лучше обрабатываются std::valarray.

1 голос
/ 19 июля 2010

Сам вектор STL не допускает поэлементного масштабирования за одну операцию.

Вы можете обернуть свой вектор декоратором, который применяет коэффициент масштабирования. Применение нового фактора будет O (1) независимо от размера вектора. Это не бесплатно, недостатками являются повышенная сложность и несколько больший доступ для каждого элемента.

1 голос
/ 19 июля 2010

Вы можете использовать std :: transform:

 std::transform(Array.begin(), Array.end(), Array.begin(), std::bind1st(std::multiplies<double>(), 0.5)));
0 голосов
/ 19 июля 2010

как я знаю нет.

если есть, возможно, он инкапсулирует этот цикл для вастак что я не думаю, что производительность изменится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...