Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 捕获列表中的迭代器差异并使用它删除向量的元素_C++_Vector_Iterator - Fatal编程技术网

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个算法吗