C++ 捕获列表中的迭代器差异并使用它删除向量的元素
我有一个向量,我想从中去掉所有奇数。我是这样做的C++ 捕获列表中的迭代器差异并使用它删除向量的元素,c++,vector,iterator,C++,Vector,Iterator,我有一个向量,我想从中去掉所有奇数。我是这样做的 #include <iostream> #include <vector> int main() { std::vector<int> v={1,2,3,4,5,6,7,8,9}; std::vector<int>::iterator it2=v.begin(); while(it2!=v.end()) { for ( it2= v.begin();i
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v={1,2,3,4,5,6,7,8,9};
std::vector<int>::iterator it2=v.begin();
while(it2!=v.end())
{
for ( it2= v.begin();it2!=v.end();++it2)
{
if ((*it2)%2==1){
v.erase(it2);
break;
}
}
}
for(it2=v.begin(); it2!=v.end();++it2)
std::cout<<*it2<<" ";
}
#包括
#包括
int main()
{
向量v={1,2,3,4,5,6,7,8,9};
std::vector::迭代器it2=v.begin();
while(it2!=v.end())
{
对于(it2=v.begin();it2!=v.end();+it2)
{
如果((*it2)%2==1){
v、 擦除(it2);
打破
}
}
}
for(it2=v.begin();it2!=v.end();++it2)
std::cout您可能应该使用以下内容:
v.erase(std::remove_if(v.begin(), v.end(), [](int i){ return bool(i % 2); }), v.end());
std::remove_if()
算法通过一次传递将未删除的元素移动到序列的前面。然后,它将一个迭代器返回到未删除序列的末尾。然后将该迭代器用作序列的开始,该序列应该是verase()
d和v.end()
来指示序列的结束。您将无法获得更有效的算法。您可能应该使用以下内容:
v.erase(std::remove_if(v.begin(), v.end(), [](int i){ return bool(i % 2); }), v.end());
std::remove_if()
算法通过一次传递将未删除的元素移动到序列的前面。然后,它将一个迭代器返回到未删除序列的末尾。然后将该迭代器用作序列的开始,该序列应该是verase()
d和v.end()
指示序列的结束。您将无法获得更有效的算法。您确实需要学习为您完成这项工作的STL算法。无需编写容易出错的循环
使用其他答案中所示的erase()/remove_if()习惯用法,可以很容易地根据某些条件擦除元素。如果您没有C++11,那么以下内容也就足够了:
bool IsOdd(int x) { return bool(x%2); }
...
v.erase(std::remove_if(v.begin(), v.end(), IsOdd), v.end());
你真的需要学习为你做这项工作的STL算法,没有必要编写容易出错的循环
使用其他答案中所示的erase()/remove_if()习惯用法,可以很容易地根据某些条件擦除元素。如果您没有C++11,那么以下内容也就足够了:
bool IsOdd(int x) { return bool(x%2); }
...
v.erase(std::remove_if(v.begin(), v.end(), IsOdd), v.end());
谢谢!!!现在就试试这个…同时我找到了另一种方法。while(it2!=v.end()){if((*it2)%2==1)it2=v.erase(it2);else++it2;}不能对效率发表评论谢谢!!!现在就试试这个…同时我找到了另一种方法。while(it2!=v.end()){if(*it2)%2==1)it2=v.erase(it2);else++it2;}无法评论效率思想谢谢!我是一名学生…刚刚开始学习C++11.你能推荐一些基本算法吗,因为页眉有100个算法谢谢!我是一名学生…刚刚开始学习C++11.你能推荐一些基本算法吗,因为页眉有100个算法吗