• C++
  • vector erase教程 注释 示例

  • @ 2025-3-25 18:41:09

在C++中,std::vectorerase函数用于从vector中删除指定的元素或元素范围,它有两种常见的重载形式,下面为你详细介绍:

1. 移除单个元素

  • 函数原型iterator erase(iterator position);
  • 功能:删除vectorposition迭代器所指向的元素。删除后,该位置后面的元素会向前移动,填补删除元素的空位。函数返回一个迭代器,指向删除元素之后的第一个元素。如果删除的是最后一个元素,则返回vector.end()
  • 示例代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // 要删除第三个元素(索引为2)
    std::vector<int>::iterator it = numbers.begin() + 2; 
    numbers.erase(it); 

    // 输出删除元素后的vector
    for (int num : numbers) { 
        std::cout << num << " ";
    }
    return 0;
}
  • 代码解释:先创建一个包含整数的vector,通过numbers.begin() + 2获取指向要删除元素的迭代器,然后调用erase函数删除该元素,最后遍历输出删除元素后的vector,输出结果为1 2 4 5

2. 移除指定范围内的元素

  • 函数原型iterator erase(iterator first, iterator last);
  • 功能:删除vector中从first迭代器(包含)到last迭代器(不包含)之间的所有元素。删除后,last后面的元素会向前移动。函数返回一个迭代器,指向最后一个被删除元素之后的第一个元素。
  • 示例代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    // 删除索引为1到3(不包含3)之间的元素,即删除2和3
    std::vector<int>::iterator first = numbers.begin() + 1; 
    std::vector<int>::iterator last = numbers.begin() + 3; 
    numbers.erase(first, last); 

    // 输出删除元素后的vector
    for (int num : numbers) { 
        std::cout << num << " ";
    }
    return 0;
}
  • 代码解释:创建vector后,分别获取要删除范围的起始和结束迭代器firstlast,调用erase函数删除范围内的元素,最终输出结果为1 4 5

注意事项

  • 迭代器失效:在使用erase函数后,指向被删除元素及其后面元素的迭代器都会失效。因此,在循环中使用erase时,需要正确处理迭代器,避免错误。例如,常见的错误用法:
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 3, 4};
    for (auto it = vec.begin(); it != vec.end(); ++it) {
        if (*it == 3) {
            vec.erase(it); // 这里it在erase后失效,继续++会出错
        }
    }
    return 0;
}
  • 正确的处理方式:利用erase函数的返回值更新迭代器,如:
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 3, 3, 4};
    for (auto it = vec.begin(); it != vec.end();) {
        if (*it == 3) {
            it = vec.erase(it); // 使用返回值更新迭代器
        } else {
            ++it;
        }
    }
    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}
  • remove算法结合:当需要删除vector中所有满足特定条件的元素时,可以结合std::remove算法和erase函数,这种方式更高效,称为remove-erase惯用法。示例如下:
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {1, 2, 3, 3, 4};
    // remove算法将待删除元素(这里是3)移动到容器末尾,返回指向新的逻辑末尾的迭代器
    auto new_end = std::remove(nums.begin(), nums.end(), 3); 
    // 使用erase删除逻辑末尾之后的元素
    nums.erase(new_end, nums.end()); 

    for (int num : nums) {
        std::cout << num << " ";
    }
    return 0;
}

在上述代码中,std::remove算法不会真正删除元素,而是将满足条件的元素移到容器末尾,返回一个迭代器指向新的逻辑末尾,然后再用erase函数删除逻辑末尾之后的元素 ,最终输出结果为1 2 4

0 条评论

目前还没有评论...