C++ 从循环内的向量中移除项

C++ 从循环内的向量中移除项,c++,opencv,vector,C++,Opencv,Vector,我想从循环中的向量中删除一些索引。 我目前拥有以下代码: static void store_faces(Mat image, vector<Rect> faces, string path, string fileName){ SkinDetector mySkinDetector; int counter = 0; for(int i = 0; i < faces.size(); i++){ Mat temp = image(faces.at(i));

我想从循环中的向量中删除一些索引。
我目前拥有以下代码:

static void store_faces(Mat image, vector<Rect> faces,  string path, string fileName){

 SkinDetector mySkinDetector;
 int counter = 0;
 for(int i = 0; i < faces.size(); i++){
    Mat temp = image(faces.at(i));

    double ratio= mySkinDetector.getSkin(temp);
    cout << "found face skin ratio.. " << ratio << endl;

    string file_name = path+ fileName + "_"+ NumberToString(counter)+".jpg";
    imwrite(file_name, temp);
    counter+=1;
  }
}
static void store_面(Mat图像、向量面、字符串路径、字符串文件名){
皮肤检测器;
int计数器=0;
对于(int i=0;i你可以这样做:

void fct(vector<Rect> faces)
{
    for(vector<Rect>::iterator it=faces.begin(); it!=faces.end(); /*nothing here*/)
    {
        if( condition )
            it = faces.erase(it)
        else
            ++it;
}
void fct(向量面)
{
对于(vector::iterator it=faces.begin();it!=faces.end();/*此处无任何内容*/)
{
如果(条件)
它=面。擦除(它)
其他的
++它;
}

您可以这样做:

void fct(vector<Rect> faces)
{
    for(vector<Rect>::iterator it=faces.begin(); it!=faces.end(); /*nothing here*/)
    {
        if( condition )
            it = faces.erase(it)
        else
            ++it;
}
void fct(向量面)
{
对于(vector::iterator it=faces.begin();it!=faces.end();/*此处无任何内容*/)
{
如果(条件)
它=面。擦除(它)
其他的
++它;
}

正确的方法是:

std::vector<Rect> vec = ...;
auto tail = std::remove_if(vec.begin(), vec.end(), [&](Rect const & rect) -> bool {
    return mySkinDetector.getSkin(image(rect)) < 0.5;
});

vec.erase(tail, vec.end());
std::vector向量=。。。;
auto tail=std::remove_if(vec.begin()、vec.end()、[&](Rect const&Rect)->bool{
返回mySkinDetector.getSkin(image(rect))<0.5;
});
向量擦除(tail,vec.end());

正确的方法是:

std::vector<Rect> vec = ...;
auto tail = std::remove_if(vec.begin(), vec.end(), [&](Rect const & rect) -> bool {
    return mySkinDetector.getSkin(image(rect)) < 0.5;
});

vec.erase(tail, vec.end());
std::vector向量=。。。;
auto tail=std::remove_if(vec.begin()、vec.end()、[&](Rect const&Rect)->bool{
返回mySkinDetector.getSkin(image(rect))<0.5;
});
向量擦除(tail,vec.end());
应该是:

for(int i = 0; i < faces.size(); i++){
    Mat temp = image(faces.at(i));

    //[...]

    if(ratio<0.5)
       faces.erase(faces.begin()+i);

    //[...]
}
for(int i=0;i
for(int i = 0; i < faces.size(); i++){
    Mat temp = image(faces.at(i));

    //[...]

    if(ratio<0.5)
       faces.erase(faces.begin()+i);

    //[...]
}
for(int i=0;iif(Ratio)这与opencv有什么关系的可能重复?+1 adam.简单的解决方案,向后循环向量,并使用my_vector.erase(my_vector.begin()+i)删除元素。您通过值传递
,这意味着您在函数中对它所做的任何更改都是在临时向量上完成的。如果您希望传递的
向量在返回时被更改,则它不会被更改。如果所需的行为是具有
,则通过引用传递向量,而不是通过值传递向量>已更改。为了跟进PaulMcKenzie所写的内容,您应该避免按值传递std::containers,因为这非常昂贵。按引用传递,如果您不想更改容器,请按
const
reference传递。这可能与opencv有什么关系?+1 adam重复。简单的解决方案,在vec上循环tor使用my_vector.erase(my_vector.begin()+i)向后移动并删除元素。您通过值传递
,这意味着您在函数中对它所做的任何更改都是在临时向量上完成的。如果您希望传递的
向量在返回时被更改,则它不会被更改。如果所需的行为是具有
,则通过引用传递向量,而不是通过值传递向量>已更改。根据PaulMcKenzie编写的内容,您应该避免按值传递std::containers,因为这非常昂贵。按引用传递,如果您不想更改容器,请按
const
reference传递。您将跳过元素,除非您仅有条件地递增
i
。您将ip元素,除非您仅有条件地递增
i