Ich bin nicht ganz sicher, was eine "Faltung" von zwei Sequenzen zu einer dieser beiden Sequenzen sein soll: Es scheint ein anderes Verständnis als mein Verständnis zu sein. Unten ist eine Version von convolution mit einer variablen Anzahl von Iteratoren. Da ich im Moment einfach zu faul bin, verwende ich eine etwas ungewöhnliche Vorstellung davon, den Ziel-Iterator als erstes Argument und nicht als letztes Argument zu übergeben. Hier ist eine Implementierung eines entsprechenden zip()
Algorithmen:
#include <tuple>
namespace algo
{
template <typename... T>
void dummy(T...)
{
}
template <typename To, typename InIt, typename... It>
To zip(To to, InIt it, InIt end, It... its)
{
for (; it != end; ++it, ++to) {
*to = std::make_tuple(*it, *its...);
algo::dummy(++its...);
}
return to;
}
}
Es folgt ein einfaches Prüfprogramm ich, dass die oben zu verifizieren ist, was ich es vorhatte:
#include <deque>
#include <iostream>
#include <iterator>
#include <list>
#include <vector>
enum class e { a = 'a', b = 'b', c = 'c' };
std::ostream& operator<< (std::ostream& out,
std::tuple<int, double, e> const& v)
{
return out << "["
<< std::get<0>(v) << ", "
<< std::get<1>(v) << ", "
<< char(std::get<2>(v)) << "]";
}
int main()
{
typedef std::tuple<int, double, e> tuple;
std::vector<int> v{ 1, 2, 3 };
std::deque<double> d{ 1.1, 2.2, 3.3 };
std::list<e> l{ e::a, e::b, e::c };
std::vector<tuple> r;
algo::zip(std::back_inserter(r), v.begin(), v.end(), d.begin(), l.begin());
std::copy(r.begin(), r.end(),
std::ostream_iterator<tuple>(std::cout, "\n"));
}
Es ist nicht schwer zu schreiben Dies fügt zu einem dritten Bereich hinzu, der anfänglich mit Nullen gefüllt ist. An Ort und Stelle, ich weiß es nicht. – aschepler
Unter der Annahme, dass dies eine diskrete Faltung sein wird, bei der die Bereiche die gleiche Länge haben, ist dies nicht allzu schwer - es wäre der Transformation ziemlich ähnlich. Tatsächlich ist es sogar möglich, dass Sie transform verwenden können, um dies zu tun, wobei der 3. Parameter ein umgekehrter Iterator ist. – Yuushi