我有一个载有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向量。
答案 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);