給定一個數值向量,我怎樣才能將其連續的子向量摺疊成一個更小的向量?當然,使用STL算法。如何摺疊STL向量的子向量?
例如,將矢量{1,2,3,4,5,6,7}摺疊成子矢量大小爲3,並且求和操作應給出{1 + 4 + 7,2 + 5,3 +6}
給定一個數值向量,我怎樣才能將其連續的子向量摺疊成一個更小的向量?當然,使用STL算法。如何摺疊STL向量的子向量?
例如,將矢量{1,2,3,4,5,6,7}摺疊成子矢量大小爲3,並且求和操作應給出{1 + 4 + 7,2 + 5,3 +6}
這似乎是個伎倆。 可以進一步模板化以支持除添加以外的操作。
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
template <typename T>
std::vector<T> foldSubVectors(const std::vector<T>& v, unsigned int foldSize)
{
std::vector<T> result (foldSize, 0);
unsigned int i = 0;
for (i = 0; i + foldSize <= v.size(); i += foldSize)
std::transform(result.begin(), result.end(), v.begin() + i,
result.begin(), std::plus<T>());
if (i < v.size())
std::transform(result.begin(), result.begin() + (v.size() - i),
result.begin() + i, result.begin(), std::plus<T>());
return result;
}
我不確定您是如何決定將哪些元素進行求和的。 –
根據子矢量大小= 3 – Danra
[此方法](https://gist.github.com/4139671)是否解決了這個問題?正如所寫,它需要C++ 0x,但它肯定可以被重寫。 – DCoder