Ваше решение не работает: на самом деле оно иллюстрирует простую проблему, на которую многие наткнулись.
Описание алгоритмов, как правило, не учитывает конечное представление памяти, которое есть у компьютеров.
В частности, здесь int
может содержать только столько битов, и, таким образом, добавление может привести к переполнению , что является неопределенным поведением (на x86 оно выполняется, но на других процессорахэто может вызвать аппаратное исключение).
Существует два правильных (и простых) решения для обмена двумя int
:
int tmp = lhs; lhs = rhs; rhs = tmp;
, также известными как swap
lhs ^= rhs; rhs ^= lhs; lhs ^= rhs;
, также известный как трюк XOR
Очевидно, что оба варианта применимы в случае массивов.
Другим более эффективным решением было бы поменять местамисами массивы.
std::swap(a,b);
Примечание: если массивы размещены статически, их невозможно поменять местами напрямую, но вы можете использовать только указатели на статически распределенные массивыи, таким образом, поменяйте местами указатели
Предупреждение: объекты, которые уже имеют ссылку на массивы, не будут уведомлены о свопе, в этом случае у вас нет другого выбора, кроме как поменять их местами.содержание.