C++之std::vector删除元素的几种方式及区别说明

 更新时间:2023年08月07日 11:10:12   作者:休息一下接着来  
这篇文章主要介绍了C++之std::vector删除元素的几种方式及区别说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

容器vector在删除过程中,常用的函数。

函数作用
pop_back()删除 vector 容器中最后一个元素,该容器的大小(size)会减 1,但容量(capacity)不会发生改变。
erase(iter)删除 vector 容器中iter迭代器指定位置处的元素,并返回指向被删除元素下一个位置元素的迭代器。该容器的大小(size)会减 1,但容量(capacity)不会发生改变。
erase(iter1,iter2)删除 vector 容器中位于迭代器 [iter1,iter2)指定区域内的所有元素,并返回指向被删除区域下一个位置元素的迭代器。该容器的大小(size)会减小,但容量(capacity)不会发生改变。
clear()删除 vector 容器中所有的元素,使其变成空的 vector 容器。该函数会改变 vector 的大小(变为 0),但不是改变其容量。
remove(iter1,iter2,key)删除容器中所有和指定元素值相等的元素,并返回指向最后一个元素下一个位置的迭代器。值得一提的是,调用该函数不会改变容器的大小和容量。(后面会详细说明,该函数的用法)
swap(vector)用于交换向量的内容,用一个向量调用它并接受另一个向量作为参数并交换它们的内容。 (两个向量的大小可能不同)。通过交换向量进行删除。
shrink_to_fit()将vector 容器的容量缩减至和实际存储元素的个数相等。可以配合以上的函数,收回内存

注意:

  • 容器的大小size:容器实际存放元素的数量。
  • 容器的容量capacity:容器在内存中开辟空间的容量(在不开辟新的空间时,能存放数据的大小)。

1. 使用earse和remove配合删除容器中指定值的元素

remove函数本质上其实并没有完成元素的完全删除工作,因为容器的大小都没有改变,它只是将所有被删除的元素用下一个不被删除的元素进行覆盖,同时返回一个迭代器,在该迭代器之前的所有元素,保留原容器的顺序,并且不存在被删除的元素,也就是你想要的容器内容,而该迭代器到容器的末尾则不变,也就是说,原容器的大小没有发生变化,被删除的元素也确实没有了,但容器末尾的一些元素(个数等于被删除元素个数)又会多出来一份,这是我们不愿意看到的,因此需要借助上面提到的erase函数。所以说remove需要和erase搭配使用才能实现完整的删除功能。

单独使用remove

#include <iostream>
#include <vector>
#include <algorithm>			// [注意] :remove位于algorithm函数库中
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};
    std::cout << vecInt.size() << std::endl;     // 输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量
    std::remove(vecInt.begin(), vecInt.end(),3);
    std::cout << vecInt.size() << std::endl;     // 输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量
    for(auto i : vecInt)
    {
        std::cout << i << std::endl;
    }
}
// 使用remove之前,容器vector的值为: 0,1,2,3,4
// 使用remove函数删除值为3的元素后,容器vector的值为:0,1,2,4,4
// 可以看出remove,没有改变容器的size,只是将值为3的元素删除后,将后面的元素,移动到前面(后面的值还保留,因此最后是4)。

earse和remove配和使用

#include <iostream>
#include <vector>
#include <algorithm>		// [注意] :remove位于algorithm函数库中
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};
    std::cout << vecInt.size() << std::endl;     // 输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量
    vecInt.erase(std::remove(vecInt.begin(), vecInt.end(), 3), vecInt.end());
    std::cout << vecInt.size() << std::endl;     // 输出的结果为4,容器中存了4个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量
    for(auto i : vecInt)
    {
        std::cout << i << std::endl;
    }
}
// 使用remove之前,容器vector的值为: 0,1,2,3,4
// 使用remove函数删除值为3的元素后,容器vector的值为:0,1,2,4,
// 可以看出remove,容器的size变成了size-1,删除了值为3的元素。容器的capacity不变

注意:

  • remove位于algorithm函数库中,使用时需要调用algorithm头文件。
  • earse和remove不改变vector的容量capacity,(不会收回容器在内存中开辟的空间)

2. 使用swap删除容器的所有元素,并收回内存

使用clear清空容器中的元素

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vecInt{0, 1 , 2 ,3 ,4};
    std::cout << vecInt.size() << std::endl;     //  输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量
    vecInt.clear();					// 使用clear清空容器
    std::cout << vecInt.size() << std::endl;     // 输出的结果为0,容器中存了0个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为5,容器在内存开辟空间的容量
}

可以看出使用clean可以清空vector,但是不会改变capacity,(不会收回容器在内存中开辟的空间)。

使用swap清空容器中的元素

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vecInt{0, 1, 2, 3, 4};
    std::cout << vecInt.size() << std::endl;      //  输出的结果为5,容器中存了5个元素
    std::cout << vecInt.capacity() << std::endl;  //  输出的结果为5,容器在内存开辟空间的容量
    std::vector<int>().swap(vecInt);		// 使用swap函数,将容器与空的容器交换,从而删除容器数据,并且收回内存
    std::cout << vecInt.size() << std::endl;     // 输出的结果为0,容器中存了0个元素
    std::cout << vecInt.capacity() << std::endl; // 输出的结果为0,容器在内存开辟空间的容量
}

使用swap函数,将容器与空的容器交换,从而删除容器所有数据,并且收回内存。

注意:

这里没有为 std::vector() 表达式传递任何参数。

这意味着,此表达式将调用 vector 模板类的默认构造函数,而不再是复制构造函数。

也就是说,此格式会先生成一个空的 vector 容器,再借助 swap() 方法将空容器交换给 vecInt,从而达到清空 vecInt 的目的。

3. 使用shrink_to_fit()配合其他函数,删除元素并回收内存

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> vecInt{0, 1, 2, 3, 4};
    vecInt.pop_back(); 				// 删除容器中的最后一个元素
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的数量为4
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量为5。
    vecInt.shrink_to_fit();				//  将vector 容器的容量缩减至和实际存储元素的个数相等
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的数量为4
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量为4。
    vecInt.clear();				//清空容器
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的数量为0
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量为4。
    vecInt.shrink_to_fit();			//  将vector 容器的容量缩减至和实际存储元素的个数相等
    std::cout << vecInt.size() << std::endl;     // 容器vecInt中元素的数量为0
    std::cout << vecInt.capacity() << std::endl; // 容器vecInt容量为0。
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++与Lua交互内存分配详解

    C++与Lua交互内存分配详解

    C/C++ 与 Lua 的交互是通过 lua_State 这一句柄进行交互,我们常规的创建都是通过 luaL_newstate 这一辅助函数,这篇文章主要给大家详细介绍了C++与Lua交互内存分配,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11
  • Qt生成随机数的方法

    Qt生成随机数的方法

    本文主要介绍了Qt生成随机数,生成随机数主要用到了函数qsrand和qrand,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言用指针函数寻找数组中的最大值与次大值

    C语言用指针函数寻找数组中的最大值与次大值

    这篇文章主要给大家介绍了关于C语言用指针函数寻找数组中的最大值与次大值的相关资料,该代码通过定义一个名为LargestTow的函数来找出数组中的最大值和次大值,并将结果分别存入指针所指向的内存单元中,需要的朋友可以参考下
    2024-11-11
  • Reactor反应器的实现方法详解

    Reactor反应器的实现方法详解

    本篇文章是对Reactor反应器的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • Qt简单实现密码器控件

    Qt简单实现密码器控件

    这篇文章主要为大家详细介绍了Qt简单实现密码器控件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 详解C++中的指针结构体数组以及指向结构体变量的指针

    详解C++中的指针结构体数组以及指向结构体变量的指针

    这篇文章主要介绍了C++中的指针结构体数组以及指向结构体变量的指针的用法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言控制进程之进程等待详解

    C语言控制进程之进程等待详解

    这篇文章主要介绍了C语言控制进程之进程等待即回收子进程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • 探讨编写int strlen(char *strDest);不允许定义变量的问题

    探讨编写int strlen(char *strDest);不允许定义变量的问题

    本篇文章是对编写int strlen(char *strDest);不允许定义变量的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 详解C语言学习记录之指针

    详解C语言学习记录之指针

    关于指针,其是C语言的重点,C语言学的好坏,其实就是指针学的好坏。其实指针并不复杂,学习指针,要正确的理解指针,本片文章能给就来学习一下
    2021-11-11
  • C语言双指针算法朋友过情人节我过算法

    C语言双指针算法朋友过情人节我过算法

    这篇文章主要为大家介绍了C语言中双指针算法的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02

最新评论