C++ 查找值并从矢量中删除

C++ 查找值并从矢量中删除,c++,vector,C++,Vector,假设有5个元素的向量 vector<int> V; for (int i=0;i<5;i++){ v.push_back(i); } 现在如何使用find if和erase从向量中删除大于2的值? 请你推荐一个我准备的示例代码,但我不确定。 谢谢您可以使用和使用合适的函子。比如说 V.erase(std::remove_if(std::begin(V), std::end(V), [](int i){ return i >

假设有5个元素的向量

vector<int> V;
for (int i=0;i<5;i++){
v.push_back(i);
}
现在如何使用find if和erase从向量中删除大于2的值? 请你推荐一个我准备的示例代码,但我不确定。 谢谢

您可以使用和使用合适的函子。比如说

V.erase(std::remove_if(std::begin(V), std::end(V),
                       [](int i){ return i > 2; } ), 
                       std::end(V) );
如果您一直使用C++11之前的编译器,那么

bool func(int i) { return i > 2; }

V.erase(std::remove_if(V.begin(), V.end(), func), V.end());
可以使用和适当的函子。比如说

V.erase(std::remove_if(std::begin(V), std::end(V),
                       [](int i){ return i > 2; } ), 
                       std::end(V) );
如果您一直使用C++11之前的编译器,那么

bool func(int i) { return i > 2; }

V.erase(std::remove_if(V.begin(), V.end(), func), V.end());

如果只使用擦除方法和迭代器,则这是一种不使用std::remove_的替代解决方案

typedef std::vector<int> IntVector;
IntVector v;
// fill
for (IntVector::iterator it = v.begin(); it != v.end();) {
    if (*it > 2) {
        it = v.erase(it);
    } else {
        ++it;
    }
}

如果只使用擦除方法和迭代器,则这是一种不使用std::remove_的替代解决方案

typedef std::vector<int> IntVector;
IntVector v;
// fill
for (IntVector::iterator it = v.begin(); it != v.end();) {
    if (*it > 2) {
        it = v.erase(it);
    } else {
        ++it;
    }
}

您可以根据谓词条件从向量中删除:

std::vector<int>::iterator it = std::remove_if(      // it shifts, doesn't 
                                v.begin(), v.end(),  // reduces the physical size
                                [](int i){ return i > 2; } ));
如果后面跟着擦除,为什么要删除 通过移动分配的方式进行移动 范围中的元素,使 将被删除的内容显示在范围的开头。相对顺序 保留下来的元素和 容器不变。指向元素之间的元素的迭代器 新的逻辑端和范围的物理端仍然是 可取消引用,但元素本身具有未指定的值 根据可移动和可分配的立柱条件。调用remove通常是 然后调用容器的擦除方法,该方法将擦除 未指定的值,并将容器的物理大小减小为 匹配其新的逻辑大小

实例 C++03:

bool f(int i) { return i > 2; }
std::vector<int>::iterator it = std::remove_if( v.begin(), v.end(), f); // shifts
v.erase( it, v.end());                               // reduces the physical size

您可以根据谓词条件从向量中删除:

std::vector<int>::iterator it = std::remove_if(      // it shifts, doesn't 
                                v.begin(), v.end(),  // reduces the physical size
                                [](int i){ return i > 2; } ));
如果后面跟着擦除,为什么要删除 通过移动分配的方式进行移动 范围中的元素,使 将被删除的内容显示在范围的开头。相对顺序 保留下来的元素和 容器不变。指向元素之间的元素的迭代器 新的逻辑端和范围的物理端仍然是 可取消引用,但元素本身具有未指定的值 根据可移动和可分配的立柱条件。调用remove通常是 然后调用容器的擦除方法,该方法将擦除 未指定的值,并将容器的物理大小减小为 匹配其新的逻辑大小

实例 C++03:

bool f(int i) { return i > 2; }
std::vector<int>::iterator it = std::remove_if( v.begin(), v.end(), f); // shifts
v.erase( it, v.end());                               // reduces the physical size

这真的很好看。C++11使事情变得优雅。为什么要用V.erase来环绕它?要删除不需要的值,如果落在后面的话会删除_,这看起来真的很不错。C++11使事情变得优雅。为什么要用V.erase围绕它?如果左贝辛迪认为你不应该修改循环中的迭代器变量,那么就删除不需要的值。@Marichyasana如果你做得对,你可以这样做。从向量中删除元素后,erase方法返回一个新的有效迭代器。请注意,在这种情况下,您不能使用它。这就是我在else而不是for部分中这样做的原因。我以为你不应该在循环中修改迭代器变量。@Marichyasana如果你做得对,你可以这样做。从向量中删除元素后,erase方法返回一个新的有效迭代器。请注意,在这种情况下,您不能使用它。这就是为什么我在else而不是for部分这样做的原因:完美答案谢谢,对不起,我问这个问题,因为我是初学者。我想知道最近提出的代码是如何工作的?一个指向函数的指针,这里指向f,被传递给。然后,该算法计算fi以检查是否满足条件,并相应地调整向量-您可以在链接中查看该算法的简化伪版本,前提是所有解决方案都能很好地工作,但我仍然存在上一个问题。我准备了一个代码,如下所示,我遇到了一个不匹配的错误{在代码中!!!!!!!int main{vector v;v.push_back1;v.push_back2;v.push_back3;v.push_back4;v.push_back5;vector::iterator it;bool fint i{return i>2;}it=std::remove_if v.begin,v.end,f;//shift v.erase it,v.end;}你可以看看这个::完美答案谢谢,对不起,我问这个问题,因为我是一个初学者。我想知道最近提出的代码是如何工作的?一个指向函数的指针,在这里指向f,被传递到。这个算法然后计算fi以检查条件是否满足,并相应地调整向量-你可以看一看t简化的伪版本的算法在链接中提供了所有的解决方案完美的工作,但我仍然有问题,最后一个我准备了一个代码如下,我面临的错误有一个不匹配的{在代码中!!!!!int main{vector v;v.push_back1;v.push_back2;v.push_back3;v.push_back4;v.push_back5;vector::迭代器it;bool fint i{return i>2;}it=std::remove_if v.begin,v.end,f;//shift v.erase it,v.end;}您可以查看以下内容: