2012-11-24 23 views
2

給定一個數值向量,我怎樣才能將其連續的子向量摺疊成一個更小的向量?當然,使用STL算法。如何摺疊STL向量的子向量?

例如,將矢量{1,2,3,4,5,6,7}摺疊成子矢量大小爲3,並且求和操作應給出{1 + 4 + 7,2 + 5,3 +6}

+1

我不確定您是如何決定將哪些元素進行求和的。 –

+0

根據子矢量大小= 3 – Danra

+1

[此方法](https://gist.github.com/4139671)是否解決了這個問題?正如所寫,它需要C++ 0x,但它肯定可以被重寫。 – DCoder

回答

1

這似乎是個伎倆。 可以進一步模板化以支持除添加以外的操作。

#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; 
} 
+0

我不認爲這將適用於任何STL實現,因爲它涉及解引用無效迭代器,除非'v.size()'是'foldsize'的精確倍數。在'v.capacity()'足夠大並且內存恰好被清除的情況下,它可能不會實際出現段錯誤或產生奇怪的結果,但是一組好的單元測試應該能夠揭示錯誤。由於這是你的問題,我不能真正評論是否遺漏不完整的尾巴是滿意的,但似乎不符合原始問題中的例子。 – rici

+0

修改爲始終正確處理尾部。 – Danra