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;i if(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
。