C++ 将长度较小的向量返回到已填充的向量
我有一个填充了x个值的向量,但我需要使用初始向量迭代函数几次,但每次返回的向量值可能更少。这就是我现在要做的,当前向量保留了所有的值,我不知道如何覆盖初始向量声明或有效地从初始向量中删除项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
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);