c++ 向量变换

flseospp  于 2023-03-05  发布在  其他
关注(0)|答案(3)|浏览(123)

只有当值在某些限制范围内时,我才必须将2D vector的值复制到另一个2D vector
为此,我写了。

[[nodiscard]] std::vector<std::vector<double>>
GetDataAfterApplyingLimits(const std::vector<std::vector<double>>& input)
{
    std::vector output(
                 input.size(), std::vector<double>(input[0].size(), MISSINGVALUE));

    for (size_t i = 0; i < input.size(); i++)
    {
        for (size_t j = 0; j < input[i].size(); j++)
        {
            if (input[i][j] >= min_value && input[i][j] <= max_value)
                output[i][j] = input[i][j];
        }
    }
    return output;
}

我使用input[0].size()来初始化上面输出vector的列大小。列维度不是固定的。
实现这一目标的最佳途径是什么?

esyap4oy

esyap4oy1#

您可以在每次迭代中创建一个空向量,并在每次迭代中添加到输出向量中。
就像

[[nodiscard]] std::vector<std::vector<double>>
GetDataAfterApplyingLimits(const std::vector<std::vector<double>>& input)
{
    std::vector<std::vector<double>> output;
    output.reserve(input.size()); // only reserve the number of raws

    for (const auto& raw: input)
    {
        std::vector<double> outRaw; // empty vector in each iteration
        for (const double ele: raw)
            if (ele >= min_value && ele <= max_value)
                outRaw.emplace_back(ele);
        
        // add to the output
        output.emplace_back(outRaw);
    }
    return output;
}
wqnecbli

wqnecbli2#

要动态确定输出向量的列大小,您可以从标头使用max_element算法来查找输入向量中内部向量的最大大小。以下是GetDataAfterApplyingLimits函数的更新实现,它可以完成此操作:

#include <algorithm>
#include <vector>

[[nodiscard]] std::vector<std::vector<double>> GetDataAfterApplyingLimits(
    const std::vector<std::vector<double>>& input, double min_value, double max_value, double MISSINGVALUE)
{
    size_t max_cols = 0;
    for (const auto& inner : input) {
        max_cols = std::max(max_cols, inner.size());
    }

    std::vector<std::vector<double>> output(input.size(), std::vector<double>(max_cols, MISSINGVALUE));

    for (size_t i = 0; i < input.size(); i++)
    {
        for (size_t j = 0; j < input[i].size(); j++)
        {
            if (input[i][j] >= min_value && input[i][j] <= max_value)
                output[i][j] = input[i][j];
        }
    }

    return output;
}
cmssoen2

cmssoen23#

如果输入的元素(向量)大小不同...

using JuggedVec = std::vector< std::vector<double> >;

[[nodiscard]]
JuggedVec GetDataAfterApplyingLimits( const JuggedVec &input )
{
    //* I don't know how these are defined...
    const double MISSINGVALUE = -99;
    const double min_value = 10;
    const double max_value = 100;

    //
    JuggedVec output;
    output.reserve( input.size() );

    for( const auto &In : input )
    {
        output.emplace_back( In.size(), MISSINGVALUE );
        auto iOut = output.back().begin();
        for( double val : In )
        {
            if( min_value<=val  &&  val<=max_value ){   *iOut=val;  }
            ++iOut;
        }
    }
    return output;
}

相关问题