Non sono abbastanza sicuro di cosa debba essere una "convoluzione" da due sequenze a una di queste due sequenze: sembra essere una comprensione diversa dalla mia comprensione. Di seguito è una versione di convolution utilizzando un numero variabile di iteratori. Poiché in questo momento sono solo troppo pigro, userò una nozione un po 'rara di passare l'iteratore di destinazione come prima discussione piuttosto che come ultima argomentazione. Ecco un'implementazione di un corrispondente zip()
algoritmi:
#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;
}
}
Ecco un semplice programma di test ho usato per verificare che il precedente non quello che intendevo fare:
#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"));
}
fonte
2012-11-17 01:27:27
Non è difficile scrivere uno che aggiunge a un terzo intervallo inizialmente riempito di zeri. Sul posto, non lo so. – aschepler
Supponendo che questa sarà una convoluzione discreta in cui le gamme hanno la stessa lunghezza, scrivendo che non è troppo difficile - sarebbe abbastanza simile alla trasformazione. In effetti, potresti persino essere in grado di utilizzare la trasformazione per fare ciò con il terzo parametro che è un iteratore inverso. – Yuushi