c++ - 平均和减少数组( vector )C++

标签 c++ arrays vector boost stl

我有一个数组(实际上是 std::vector)大小约为 7k 个元素。 如果你画出这些数据,就会有一张燃料燃烧的图表。但我想将这个 vector 从 7k 元素最小化到 721(每 0.5 度)个元素或 ~ 1200(每 0.3 度)。当然,我希望保存图表相同。我该怎么做? 现在我从大 vector 中获取每 9 个元素到新元素,并从 vector 的正面和背面均匀切割其他元素以获得 721 大小。

QVector <double> newVMTVector;
for(QVector <double>::iterator itv = oldVmtDataVector.begin(); itv < oldVmtDataVector.end() - 9; itv+=9){
    newVMTVector.push_back(*itv);
}
auto useless = newVMTVector.size() - 721;
if(useless%2 == 0){
    newVMTVector.erase(newVMTVector.begin(), newVMTVector.begin() + useless/2);
    newVMTVector.erase(newVMTVector.end() - useless/2, newVMTVector.end());
}
else{
    newVMTVector.erase(newVMTVector.begin(), newVMTVector.begin() + useless/2+1);
    newVMTVector.erase(newVMTVector.end() - useless/2, newVMTVector.end());
}
newVMTVector.squeeze();
oldVmtDataVector.clear();
oldVmtDataVector = newVMTVector;

我可以发誓有一种算法可以对数组进行平均和缩减。

最佳答案

按照我的理解,您想选择元素 [0, k, 2k, 3k ... ],其中 n 为 10 或 n 为 6。

这是一个简单的例子:

template <typename It>
It strided_inplace_reduce(It it, It const last, size_t stride) {
    It out = it;
    if (stride < 1) return last;

    while (it < last)
    {
        *out++ = *it;
        std::advance(it, stride);
    }

    return out;
}

对非随机访问迭代器进行一些概括:

Live On Coliru

#include <iterator>

namespace detail {
    // version for random access iterators
    template <typename It>
    It strided_inplace_reduce(It it, It const last, size_t stride, std::random_access_iterator_tag) {
        It out = it;
        if (stride < 1) return last;

        while (it < last)
        {
            *out++ = *it;
            std::advance(it, stride);
        }

        return out;
    }

    // other iterator categories
    template <typename It>
    It strided_inplace_reduce(It it, It const last, size_t stride, ...) {
        It out = it;
        if (stride < 1) return last;

        while (it != last) {
            *out++ = *it;
            for (size_t n = stride; n && it != last; --n)
            {
                it = std::next(it);
            }
        }

        return out;
    }
}

template <typename Range>
auto strided_inplace_reduce(Range& range, size_t stride) {
    using std::begin;
    using std::end;

    using It = decltype(begin(range));
    It it = begin(range), last = end(range);

    return detail::strided_inplace_reduce(it, last, stride, typename std::iterator_traits<It>::iterator_category{});
}

#include <vector>
#include <list>
#include <iostream>

int main() {
    {
        std::vector<int> v { 1,2,3,4,5,6,7,8,9 };
        v.erase(strided_inplace_reduce(v, 2), v.end());

        std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout << "\nv: ", " "));
    }
    {
        std::list<int> l { 1,2,3,4,5,6,7,8,9 };
        l.erase(strided_inplace_reduce(l, 4), l.end());

        std::copy(l.begin(), l.end(), std::ostream_iterator<int>(std::cout << "\nl: ", " "));
    }
}

打印

v: 1 3 5 7 9 
l: 1 5 9 

关于c++ - 平均和减少数组( vector )C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44923666/

相关文章:

c++ - 具体功能作为默认模板参数

c++ - 比较列表/集合元素

arrays - 如何在 swift 4.2 中选择多个数组元素?

c++ - 对 std::vector<int> 进行排序但忽略某个数字

c++ - 在循环中从 C++ 调用 Ruby 函数导致 "stack level too deep"

c++ - boost 内存缓冲区和字符数组

arrays - 在数组中组织多种类型的数据 swift 2

python - TensorFlow 中 LSTM 分类序列的 OneHotEncoding

c++ - 我如何错误地使用 vector 迭代器?

r - 通过在 R 中有效地连接 2 个向量的对对应元素来制作向量列表