Я не уверен, что делаю неправильно, но две версии кода, которые должны давать одинаковые результаты, дают разные результаты. Если бы кто-нибудь мог объяснить, что происходит, я был бы очень признателен.
Ситуация следующая. Я работаю с массивами как «векторами», и у меня есть простая функция sub
с двумя перегрузками для вычисления разницы между двумя векторами. Первый в основном вычисляет v := v - w
, а второй - x := v - w
.
// Subtract w[] from v[]
template <class T>
void sub(T *v, T *w, short m)
{
for (short r = 0; r < m; r++)
v[r] = v[r] - w[r];
}
// Subtract w[] from v[] and store result in x[]
template <class T>
void sub(T *v, T *w, T *x, short m)
{
for (short r = 0; r < m; r++)
x[r] = v[r] - w[r];
}
Теперь в какой-то момент мне нужно вычислить v - w
, и если оно удовлетворяет некоторому условию, заменить v
на v - w
. Если нет, v
должен остаться без изменений. Сначала у меня было
...
// temp := v - w
sub<T>(v, w, temp, m);
if (condition on temp)
{
// v := v - w
sub<T>(v, w, m);
}
...
Чтобы повысить эффективность, я подумал, что будет бессмысленно дважды вычислять одно и то же, поэтому я заменил вышеприведенное на
...
// temp := v - w
sub<T>(v, w, temp, m);
if (condition on temp)
{
// swap v and temp
std::swap(v, temp);
}
...
Переменная temp
фактически используется повторно, что может вызвать проблемы, но каждый раз, когда я впервые вызываю sub<T>(v, w, temp, m);
(таким образом, стирая все содержимое в массиве), прежде чем снова использовать temp
.
Теперь, после выполнения вышеуказанной замены, результаты моего алгоритма неожиданно меняются. Если бы кто-нибудь мог объяснить, почему результаты меняются и что происходит, я был бы очень признателен!
Заранее спасибо.
Редактировать
Быстрая проверка показывает, что в обоих случаях на каждой итерации конечное значение v
и начальное значение temp
совпадают. Так что функции делают то, что они должны делать ...
Единственная возможность объяснить причудливое поведение, которое я могу придумать, заключается в том, что по какой-то причине функция std::swap
использует случайность, что приводит к различным результатам. Я использую одно и то же начальное число для каждого прогона, и каждый раз получаю одинаковые результаты, но если std::swap
где-то использует rand()
, это объясняет разные результаты. Но я понятия не имею, почему эта функция будет использовать rand()
.