C++ 查找值并从矢量中删除
假设有5个元素的向量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 >
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;}您可以查看以下内容: