Действительно, есть более быстрый путь.Вам нужно только сравнить элементы в v1 с элементами в v2, которые меньше или равны, или первым, который больше.По сути, идея состоит в том, чтобы иметь два итератора, i
и j
, и продвигать j
, если v2[j] < v1[i]
, в противном случае продвигать i
.Вот возможная реализация:
for (int i = 0, j = 0; i < v1.size(); i++) {
while (true) {
difference = std::abs(v1[i] - v2[j]);
if (difference < mn) {
mn = difference;
index = i;
}
// Try the next item in v1 if the current item in v2 is bigger.
if (v2[j] > v1[i])
break;
// Otherwise, try the next item in v2, unless we are at the last item.
if (j + 1 < v2.size())
j++;
else
break;
}
}
Хотя он по-прежнему выглядит как двойной цикл, он вычисляет различия только самое большее v1.size() + v2.size()
раз вместо v1.size() * v2.size()
раз.