• 【原创】C++中vector与remove()函数


    话不多说,直接来

    remove()干了什么:
    把被删除元素 后面的元素 移动到当前被删除元素位置,返回最后一个被改变值的下一个迭代器。。

    举栗:

    // 首先,定义一个vector
    vector<int> demo = {1,3,3,4,3,5,6};

    vector的对应值分别为:
    1,3,3,4,3,5,6

    // 调用remove函数
    vector<int>:: iterator demo_return = remove(demo.begin(), demo.end(), 3);
    打印查看最终结果
    cout << "remove() return:" <
    for(auto iter = demo_return; iter != demo_return.end(); ++iter){
    cout << *iter << ' ';
    }
    cout << endl;
    cout << "after remove():" << endl;
    for(auto iter = demo.begin(); iter != demo.end(); ++iter){
    cout << *iter << ' ';
    }
    remove() return:
    3 5 6
    after remove():
    1 4 5 6 3 5 6
    可以看到,最终结果:

    remove函数返回值是:3,5,6

    在remove函数操作后vector为:1,4,5,6,3,5,6

    它到底做了什么?

    还是那句话:
    把被删除元素 后面的元素 移动到当前被删除元素位置,返回最后一个被改变值的下一个迭代器。。
    源码如下:

    remove(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_)
    {
    __first = _VSTD::find(__first, __last, __value_);
    if (__first != __last)
    {
    _ForwardIterator __i = __first;
    while (++__i != __last)
    {
    if (!(*__i == __value_))
    {
    *__first = _VSTD::move(*__i);
    ++__first;
    }
    }
    }
    return __first;
    }

    大致流程如下:

    1. first指针找到第一个匹配元素;
    2. 索引 i 指向 first 所指元素;
    3. 索引i向后遍历,找到与first不同的元素,赋值给first指向元素,first指针后移;
    4. 循环第3步。(索引i到vector末尾结束循环)

    画图解释一下
    image

    后续

    这样可以用来做什么?
    首先,返回的first迭代器,刚好是我们所要vector的末尾。
    也就是说demo.begin()到remove(3),是我们所需的vector(即删掉3)
    但是我们会发现,其实还有元素留在vector里(它的size容量大小没有改变)
    所以可以通过erase操作,把后面的删了(size容量变小,但是capacity容量不变)

    auto remove_iter = remve(demo.begin(), demo.end(), 3);
    demo.erase(remove_iter, demo.end());

    最终返回的结果:
    1 4 5 6

  • 相关阅读:
    【echarts入门】:vue项目中应用echarts
    使用Puppeteer进行游戏数据可视化
    Spring中获取bean的方式
    在 LLM 架构中应用多专家模型
    UG\NX二次开发 获取基准平面的点和方向 UF_MODL_ask_datum_plane
    【Eureka】【源码+图解】【八】Eureka客户端的服务获取
    全面的ASP.NET Core Blazor简介和快速入门
    SOC的多核启动流程详解
    UnrealSynth - 基于虚幻引擎的YOLO合成数据生成器
    深入liunx内核理解epoll
  • 原文地址:https://www.cnblogs.com/jev-0987/p/17510854.html