У меня есть вопрос об использовании возвращаемого значения и параметра функтора. Давайте иметь этот код:
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;}
Спасибо за ваш ответ.
Дело не в том, что лучше для вас (во всяком случае, те, которые вы предлагаете, ошибочно), а в том, что правильно с точки зрения std::transform
,
Увидеть Вот для документации.
В нем говорится, что когда вы используете унарный оператор, его знак должен быть эквивалентен следующему:
Ret fun(const Type &a);
Более того:
Подпись не должна иметь констант &,
Тип Type должен быть таким, чтобы объект typeInputIt мог быть разыменован, а затем неявно преобразован в Type.
Тип Ret должен быть таким, чтобы объект типа OutputIt мог быть разыменован и ему было присвоено значение типа Ret.
Тем не менее, кажется, что вы не поняли, что transform
предназначен для, то есть:
std :: transform применяет данную функцию к диапазону и сохраняет результат в другом диапазоне
Согласно вашему примеру, либо вы неправильно поняли это, либо это не то, что вы хотите, так что, возможно, transform
это не то, что вы ищете.
Попробуйте скомпилировать с параметром -std = c ++ 11, и вместо конструктора копирования будет вызван конструктор перемещения, который намного быстрее конструктора копирования в случае больших объектов.