将较小长度的向量返回到已经填充的Vector

时间:2017-11-29 02:14:19

标签: c++ vector return

我有一个载有x个值的向量,但是我需要使用初始向量迭代一个函数,但每次都返回一个可能更少值的向量。这是我目前所处的位置,目前向量保留了所有值,我不知道如何覆盖初始向量声明或有效地从初始向量中删除项目。

for (auto& image : images)
    {
        rValues.push_back(image->pixels[pix].r);
        gValues.push_back(image->pixels[pix].g);
        bValues.push_back(image->pixels[pix].b);
    }
    for (int i = 0; i < 5; i++)
    {
        float rMedian = calculateMedian(rValues);
        float rsD = calculateStandardDeviation(rValues);
        rValues = sigmaClip(rValues, rsD, rMedian);


        for (auto& r : rValues)
        {
            std::cout << "r val : " << r << "\n";
        }
        system("pause");
    }

(忽略rValues的std::cout,使用它来检查每次迭代是否删除了值。)

然后这就是我在sigmaClip函数中实现的,它是需要返回不同长度的向量的函数。

std::vector<float> sigmaClip(std::vector<float> values, float sD, float median)
{
    //Sigma Clip
    float upperBound = median + sD;
    float lowerBound = median - sD;
    std::vector<float> returnVals;
    for (auto& val : values)
    {
        if ((val > lowerBound) && (val < upperBound))
            returnVals.push_back(val);
    }

    return returnVals;
}

我最初尝试在传递给sigmaClip()的向量上使用.erase()和remove_if,但我不认为这些函数按照我的意图运行,因此在sigmaClip()内创建了另一个向量,返回,希望它会覆盖最初的rValues向量。

1 个答案:

答案 0 :(得分:1)

如果与std::remove_if方法配对,{p> erase应该可以正常工作,以实现the erase-remove idiom。重新定义sigmaClip以接受对values的可变引用(而不是返回它),以及类似的内容:

void sigmaClip(std::vector<float>& values, float sD, float median)
{
    //Sigma Clip
    const float upperBound = median + sD;
    const float lowerBound = median - sD;
    values.erase(std::remove_if(std::begin(values), std::end(values),
                                [=](float val) { return val < lowerBound || val > upperBound; }),
                 std::end(values));
}

应该可以正常工作,将呼叫网站更改为:

// Remove assignment back to rValues
sigmaClip(rValues, rsD, rMedian);