Алгоритм C ++ с использованием ссылки или нового значения

У меня есть вопрос об использовании возвращаемого значения и параметра функтора. Давайте иметь этот код:

int op_increase (int i) { return ++i; }

int main () {
std::vector<int> foo;
std::vector<int> bar;

// set some values:
for (int i=1; i<6; i++)
foo.push_back (i*10);                         // foo: 10 20 30 40 50

bar.resize(foo.size());                         // allocate space

std::transform (foo.begin(), foo.end(), bar.begin(), op_increase);

Теперь functor принимает значение (вызывающий конструктор копирования) и при возврате значения снова вызывает конструктор копирования. Мне любопытно, если что-то не так при использовании этих форм функтора, которые, по моему мнению, являются самыми быстрыми

int& op_increase(int& i) {return ++i;}

или просто

void op_increase(int& i) {++i;}

Спасибо за ваш ответ.

1

Решение

Дело не в том, что лучше для вас (во всяком случае, те, которые вы предлагаете, ошибочно), а в том, что правильно с точки зрения std::transform,
Увидеть Вот для документации.

В нем говорится, что когда вы используете унарный оператор, его знак должен быть эквивалентен следующему:

Ret fun(const Type &a);

Более того:

Подпись не должна иметь констант &,
Тип Type должен быть таким, чтобы объект typeInputIt мог быть разыменован, а затем неявно преобразован в Type.
Тип Ret должен быть таким, чтобы объект типа OutputIt мог быть разыменован и ему было присвоено значение типа Ret.

Тем не менее, кажется, что вы не поняли, что transform предназначен для, то есть:

std :: transform применяет данную функцию к диапазону и сохраняет результат в другом диапазоне

Согласно вашему примеру, либо вы неправильно поняли это, либо это не то, что вы хотите, так что, возможно, transform это не то, что вы ищете.

0

Другие решения

Попробуйте скомпилировать с параметром -std = c ++ 11, и вместо конструктора копирования будет вызван конструктор перемещения, который намного быстрее конструктора копирования в случае больших объектов.

-2

По вопросам рекламы [email protected]