Применение функции к 2 векторам STL - PullRequest
0 голосов
/ 25 июня 2010

В настоящее время я пытаюсь научиться эффективно использовать STL-часть c ++.Скажем, есть 2 вектора одинакового типа одинаковой длины, которые необходимо преобразовать в другой вектор той же длины с помощью некоторого оператора. Есть ли хороший способ сделать это с помощью функциональных возможностей STL?

Вот некоторый псевдокод для того, что я пытаюсь сделать:

vector<T> a;
vector<T> b;
vector<T> result;

for (int i = 0; i < a.size(); ++i){
    result.at(i) = a.at(i)  op  b.at(i);
}

, где "op" - это некоторый оператор, определенный для типа T.

Ответы [ 3 ]

8 голосов
/ 25 июня 2010

Вам может потребоваться выполнить некоторые проверки размеров, но обычно вы можете использовать std::transform.

Например (для + - <functional> содержит шаблоны классов для объектов функций для этого и других бинарных операторов)

std::transform( a.begin(), a.end(), b.begin(), result.begin(), std::plus<T>() );

Необходимо убедиться, что b.size() >= a.size() и result.size() >= a.size().Если result начинается пустым, то вы можете использовать back_insert_iterator для его заполнения без необходимости сначала изменять размер контейнера.

3 голосов
/ 25 июня 2010

Вы можете использовать std :: transform: http://www.cplusplus.com/reference/algorithm/transform/

0 голосов
/ 25 июня 2010

Хорошо, я могу ошибаться, но:

короткий ответ: нет

длинный ответ: возможно, с этим нужно что-то придумать, но писать код в виде цикла - гораздо больше

Это напоминает мне следующую проблему:

", учитывая, что вектор x и вектор y одинакового размера, переставляют элементы из x и y одновременно, так что y сортируется в соответствии с некоторымиПредикат "

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

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