21xrx.com
2024-12-22 22:37:40 Sunday
登录
文章检索 我的文章 写文章
C++中vector的erase函数详解
2023-06-29 20:16:43 深夜i     --     --
C++中 vector erase函数 详解

C++中的vector是一种可以动态扩展的数组,常用于存储数据,并具有许多方便的操作函数。其中一个重要的函数就是erase函数,可以用于删除vector中的元素。本文将详细介绍erase函数的用法和注意事项。

erase函数的基本用法是:vector_name.erase(position),其中position表示要删除的元素的位置。例如:


std::vector<int> vec 5;

vec.erase(vec.begin() + 2);

以上代码将删除vec中的第三个元素,即数字3。注意,vector的索引从0开始,因此vec.begin() + 2表示第三个元素的位置。可以使用iterator也可以使用整数索引:


std::vector<int>::iterator it = vec.begin();

vec.erase(it + 2);

erase函数还可以接受一对迭代器参数,即vector_name.erase(start, end),表示删除从start到end(不包括end)之间的所有元素。例如:


std::vector<int> vec 3;

vec.erase(vec.begin() + 1, vec.end() - 1);

以上代码将删除vec中除了第一个和最后一个元素以外的所有元素,即数字2,3,4。

需要注意的是,使用erase函数删除vector中的元素会使得后面的元素向前移动,因此vector的其他迭代器和指针可能被无效化。例如:


std::vector<int> vec 2;

std::vector<int>::iterator it = vec.begin() + 2;

vec.erase(it);

std::cout << *it << std::endl;

以上代码将输出非法值,因为it已经指向了一个无效的位置。

为了避免这种情况,可以在调用erase函数之前获取需要删除的元素的值,并保存到一个临时变量中。例如:


std::vector<int> vec 2;

std::vector<int>::iterator it = vec.begin() + 2;

int tmp = *it;

vec.erase(it);

std::cout << tmp << std::endl;

另外,如果需要删除的元素个数较多,可以考虑使用remove_if函数,它可以对满足特定条件的所有元素进行一次性删除。例如:


std::vector<int> vec 2;

vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i) return i % 2 == 0; ), vec.end());

以上代码将删除vec中所有的偶数元素,即数字2,4。

最后需要注意的是,使用erase函数删除vector中的元素可能会导致内存泄漏,因为vector只是删除了元素的内容,但并没有释放元素占据的内存空间。如果需要完全释放内存空间,可以使用vector的swap函数,将待删除的元素和vector的末尾元素交换,并之后调用pop_back函数删除末尾元素,例如:


std::vector<int> vec 4;

std::vector<int>::iterator it = vec.begin() + 2;

std::iter_swap(it, vec.end() - 1);

vec.pop_back();

以上代码将删除vec中第三个元素,并释放其占据的内存空间。

总之,erase函数是vector中非常有用的函数,但需要注意它可能会导致迭代器和指针失效,以及内存泄漏等问题。在使用erase函数时需要注意以上注意事项,并选择合适的方式来避免问题的出现。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复