通过在C++中直接访问其迭代器来删除容器的元素

Mut*_*thm 6 c++ containers iterator vector

我已经std::vector<int>在我的main函数中声明了一个并且想要从中删除所有偶数元素,但只是将它的迭代器传递给一个remove_even接受容器的开始和结束迭代器的函数.

#include <iostream>
#include <algorithm>
#include <vector>

void remove_even(auto start, auto end) {
    while(start != end) {
        if(*start % 2 == 0)
        // Remove element from container
    }
}

int main() {
    std::vector<int> vec = {2, 4, 5, 6, 7};
    remove_even(vec.begin(), vec.end());
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在C++中这样做或者我必须直接将我的向量传递给函数?

Vla*_*cow 5

std::vector本身具有erase允许擦除向量中所需元素的方法.

使用迭代器所能做的就是调用标准算法std::remove_if,然后在方法调用中使用返回的迭代器erase.

例如

#include <iostream>
#include <vector>
#include <algorithm>

std::vector<int>::iterator remove_even( std::vector<int>::iterator first,
                                        std::vector<int>::iterator last )
{
    return std::remove_if( first, last, []( int x ) { return x % 2 == 0; } );
}

int main()
{
    std::vector<int> vec = { 2, 4, 5, 6, 7 };

    for ( int x : vec ) std::cout << x << ' ';
    std::cout << std::endl;

    vec.erase( remove_even( vec.begin(), vec.end() ), vec.end() );

    for ( int x : vec ) std::cout << x << ' ';
    std::cout << std::endl;
}    
Run Code Online (Sandbox Code Playgroud)

程序输出是

2 4 5 6 7 
5 7 
Run Code Online (Sandbox Code Playgroud)