C++ 将长度较小的向量返回到已填充的向量

C++ 将长度较小的向量返回到已填充的向量,c++,vector,return,C++,Vector,Return,我有一个填充了x个值的向量,但我需要使用初始向量迭代函数几次,但每次返回的向量值可能更少。这就是我现在要做的,当前向量保留了所有的值,我不知道如何覆盖初始向量声明或有效地从初始向量中删除项 for (auto& image : images) { rValues.push_back(image->pixels[pix].r); gValues.push_back(image->pixels[pix].g); bValue

我有一个填充了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");
    }

我最初尝试使用.erase()和remove_if将向量传递到
sigmaClip()
中,但我认为这些函数没有按照我的预期工作,因此在
sigmaClip()中创建了另一个向量
并返回该值,希望它会覆盖初始的右值向量。

std::remove\u if
如果与要生效的
擦除
方法配合使用,则可以很好地完成这项工作。重新定义
sigmaClip
以接受对
值的可变引用(而不是返回它),以及类似以下内容:

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));
}

如果目标是对传递给
sigmaClip
向量进行变异,将其作为参考参数,并且
std::remove\u如果
在其上运行良好,则无需创建新的
向量
,因此无需不断替换现有向量。您好,我尝试实现了您上面的建议,但cout似乎仍在打印所有的值。不确定你是否知道西格玛剪辑。但是我尝试在初始向量中迭代多次,去除异常值,在x次迭代后从剩余值中取平均值。我认为你的建议与我想要实现的目标是一致的。这和我去极化右值向量的方式有关吗<代码>标准::向量右值;std::向量值;std::向量b值
@publicMan:你注意到sigmaClip的原型中的变化了吗?它现在通过可变引用(
std::vector&
)而不是通过值(
std::vector&
)接受
向量。如果按值接受,则删除操作将只影响
sigmaClip
中的副本,而不影响调用方副本;通过引用接受意味着您可以就地编辑调用方的
向量
。是的,我已将sigmaClip更改为接受
&值
。但它似乎仍然没有从向量中删除值。对不起,不理解,我是新的C++ +整个通过引用等。在一些不同的点打印出来,似乎ReaveIIF没有做任何事情。
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);