面试二十五、remove和earse的区别

        vector中erase的作用是删除掉某个位置position或一段区域(begin, end)中的元素,减少其size,返回被删除元素下一个元素的位置。

        vector中remove的作用是将范围内为val的值都remove到后面,返回新的_last值(非val部分的end),但传入的原vector的end并没有发生改变,因此size也就没有变化。

remove

  remove 函数通常用于从容器(如数组、向量、列表等)中删除指定值的元素。但是,它不会改变容器的大小,而是将要删除的元素移动到容器的末尾,并返回一个指向新的逻辑末尾的迭代器。然后你可以使用容器的 erase 函数将这些元素从容器中删除。remove 可以用于序列式容器(如数组、向量),也可以用于关联式容器(如集合、映射),但是它的行为在关联式容器中可能会有所不同。

std::vector<int> vec{1, 2, 3, 4, 5};
auto new_end = std::remove(vec.begin(), vec.end(), 3);
vec.erase(new_end, vec.end());
// 此时 vec 变为 {1, 2, 4, 5}

erase

   erase 函数用于从容器中删除指定位置或范围的元素,并返回指向删除后的新位置的迭代器。它可以用于序列式容器和关联式容器,其行为在不同容器类型上可能有所不同。

std::vector<int> vec{1, 2, 3, 4, 5};
vec.erase(vec.begin() + 2); // 删除第三个元素
// 此时 vec 变为 {1, 2, 4, 5}

std::set<int> s{1, 2, 3, 4, 5};
s.erase(3); // 删除值为 3 的元素
// 此时 s 变为 {1, 2, 4, 5}

1. erase大小变了, remove大小不变

2. erase返回值是下一个元素的迭代器,remove返回一个指向新的逻辑末尾的迭代器

std::remove_if

  • std::remove_if 函数用于根据指定的条件删除容器中的元素。它将满足条件的元素移动到容器的末尾,并返回一个指向新的逻辑末尾的迭代器。和 std::remove 一样,它不会改变容器的大小,你需要使用容器的 erase 函数来彻底删除这些移动到末尾的元素。
    std::vector<int> vec{1, 2, 3, 4, 5};
    auto new_end = std::remove_if(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; });
    vec.erase(new_end, vec.end());
    // 此时 vec 变为 {1, 3, 5}
    

### 比较 `remove` `erase` 函数 在编程语言中,特别是像 C++ 这样的语言,`remove` `erase` 是两个用于处理容器内元素的重要函数,但它们的工作方式适用场景有所不同。 #### `remove` `remove` 主要应用于标准模板库 (STL) 容器,其功能是从给定范围 `[first, last)` 中移除所有等于特定值的元素。然而需要注意的是,尽管名字叫作 "remove",该操作实际上并不会改变容器大小;相反,它会将不匹配项移动到序列前端并返回新的逻辑终点迭代器[^1]。这意味着如果希望真正删除这些元素,则还需要配合其他方法来调整容器的实际尺寸。 对于关联式容器(如 set 或 map),存在名为 `erase` 的成员函数而非 `remove` 来实现类似目的。 ```cpp #include <algorithm> #include <vector> std::vector<int> vec = {0, 1, 2, 3, 4}; auto new_end = std::remove(vec.begin(), vec.end(), 2); // 将非2元素移到前面 vec.erase(new_end, vec.end()); // 删除剩余部分以缩减向量容量 ``` #### `erase` 相比之下,`erase` 更加直接地作用于容器本身,能够依据指定位置或范围内的一系列索引来彻底清除目标数据,并相应减少容器规模。此行为适用于大多数 STL 容器类型,包括但不限于 vector、list 及 deque 等顺序容器以及上述提到过的关联容器。 当涉及到堆结构时,除了基本的插入与弹出最大/最小值外,有时也需要提供额外的功能支持,比如 `remove_heap` `change_heap` 提供了无法高效外部实现的操作特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值