PB RepeatedField::erase

本文介绍了一种在遍历过程中删除元素的技巧,通过使用迭代器的erase方法,避免了手动递增迭代器的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 官网说明

二 使用

auto iter = users->begin();
for (; iter != users->end();) {
  if (s.find(iter->uid()) == s.end()) {
    iter = users->erase(iter); // iter不递增,利用erase的返回值
  } else {
    ++iter;
  }
}

### `std::vector::erase` 的使用示例与注意事项 `std::vector::erase` 是用于从容器中删除元素的成员函数,支持删除单个元素或一段范围内的多个元素。该方法在处理动态数组时非常常用,尤其是在需要动态调整容器大小的场景中。其基本使用方式包括传入单个迭代器或一对迭代器表示的范围[^5]。 #### 使用示例 以下是一个使用 `std::vector::erase` 删除元素的简单示例: ```cpp #include <iostream> #include <vector> int main() { std::vector<int> vec = {10, 20, 30, 40, 50}; // 删除第三个元素(值为 30) vec.erase(vec.begin() + 2); // 输出剩余元素 for (int num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; } ``` 输出为: ``` 10 20 40 50 ``` 此外,也可以删除指定范围内的所有元素: ```cpp vec.erase(vec.begin() + 1, vec.begin() + 3); // 删除索引 1 到 2 的元素 ``` #### 注意事项 - **迭代器失效问题**:调用 `erase` 后,指向被删除元素及其之后元素的所有迭代器、指针和引用都会失效。因此,在循环中删除元素时需要特别小心,避免使用失效的迭代器继续操作。 - **结合 `std::remove_if` 使用**:若需要删除满足特定条件的一组元素,推荐使用 `std::remove_if` 配合 `erase` 实现“擦除-移除”惯用法。这种方式避免了手动管理迭代器失效的问题,例如: ```cpp vec.erase(std::remove_if(vec.begin(), vec.end(), [](int x) { return x % 2 == 0; // 删除所有偶数 }), vec.end()); ``` - **性能考量**:删除中间或开头的元素会导致后续元素被向前移动,这在大型容器中可能带来性能损耗。若频繁删除中间元素,应考虑使用 `std::list` 等更适合的容器。 - **容器大小变化**:调用 `erase` 会改变容器的大小,删除元素后 `size()` 会相应减少。 - **删除所有匹配元素**:若希望删除所有等于特定值的元素,应使用 `std::remove` 和 `erase` 的组合: ```cpp vec.erase(std::remove(vec.begin(), vec.end(), 30), vec.end()); ``` 这种方式确保所有匹配值都被移除,且容器大小正确调整。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值