【问题标题】:How to fold sub-vectors of an STL vector?如何折叠 STL 向量的子向量?
【发布时间】:2012-11-24 12:34:09
【问题描述】:

给定一个数字向量,如何将其连续的子向量折叠成一个较小的向量?当然是使用 STL 算法。

例如折叠子向量大小为 3 的向量 {1,2,3,4,5,6,7},求和运算应该得到 {1+4+7,2+5,3+ 6}

【问题讨论】:

  • 我不确定你是如何决定应该对哪些元素求和的。
  • 根据子向量大小=3
  • this approach 解决问题了吗?就像写的那样,它需要 C++0x,但它肯定可以重写为。
  • @DCoder,我找不到您正在使用的 accumulate 重载的文档或标题。
  • gotapi查看第二个重载。

标签: c++ algorithm stl vector


【解决方案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;
}

【讨论】:

  • 我认为这不适用于任何 STL 实现,因为它涉及取消引用无效迭代器,除非 v.size()foldsize 的精确倍数。在v.capacity() 足够大并且内存恰好被清除的情况下,它实际上可能不会出现段错误或产生奇怪的结果,但是一组好的单元测试应该可以揭示错误。由于这是您的问题,我无法评论是否省略不完整的尾巴是否令人满意,但这似乎与原始问题中的示例不符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
相关资源
最近更新 更多