Данная заметка не претендует ни на что и всего лишь анализ прочитанной литературы. В этой заметке я покажу как написать аналог функции zip, известную из языков Python с помощью C++. Она будет работать только для векторов, содержащих значения типа double, чтобы не отвлекаться от механики итераторов.
Вступление
Я люблю Python за краткость и элегантность. Один из примеров проявления данной элегантности — реализация формул, например скалярного произведения. Если даны два математических вектора, то нахождение их скалярного произведения означает попарное умножение чисел на одинаковых позициях вектора, а затем суммирование этих умноженных значений. Скалярное произведение векторов (a, b, c) * (d, e, f) равно (a * d + b * e + c * f).
Конечно, это можно сделать и с помощью языков C и C++. Код выглядел бы следующим образом:
В Python такой код можно писать динамически одной строкой, не подключая конкретные функции библиотек:
count = 0
a = [1.0, 2.0, 3.0]
b = [4.0, 5.0, 6.0]
sum([p[0] * p[1] for p in zip(a,b)])
Магическую функцию zip принимает два вектора a и b и преобразует их в смешанный вектор. Например, при вызове этой функции векторы [a1, a2, a3] и [b1, b2, b3] будут выглядеть как [ (a1, b1), (a2, b2), (a3, b3) ]. Это даёт возможность проитерировать по одному объединенному промежутку, выполнив попарное умножение и сложив результаты в переменную-аккумулятор. Приэтом не используются ни циклы, ни ненужные индексные переменные.