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

标签 c++ vector iterator containers

我已经声明了 std::vector<int>在我的主函数中,并想从中删除所有偶数元素,但只能将它的迭代器传递给一个名为 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());
}

有没有办法在 C++ 中执行此操作,还是我必须直接将 vector 传递给函数?

最佳答案

std::vector 本身具有方法 erase 允许删除 vector 中所需的元素。

使用迭代器您所能做的就是调用标准算法 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;
}    

程序输出为

2 4 5 6 7 
5 7 

关于c++ - 通过在 C++ 中单独直接访问其迭代器来删除容器的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35746497/

相关文章:

c++ - 二叉树的递归搜索同时返回 true 和 false

c++ - 当我尝试打印 vector 的内容时编译器出错?

iterator - rxjs,仅在上一个操作完成后才调用生成器上的下一个

java - 实现双向链表的迭代器

c++ - 如何删除文件中的数据存储?

c++ - 应用程序在 C++ 中的 Python 扩展函数中随机给出段错误

c++ - 在循环中对 vector 进行排序

javascript - 在 ECMAScript 6 草案中,使用 StopIteration 异常来表示迭代结束的基本原理是什么?

c++ - 比 unordered_map 更快的数据结构?

vector - 如何在Rust中转置向量的向量?