C++STL之vector详解

以你之姓@ 2023-07-25 09:36 85阅读 0赞

一、STL简介

  1. STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL C++ 标准库的一部分,不用单独安装。
  2. C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。例如,vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash\_set 的底层为哈希表。
  3. STL 从根本上讲是“容器”的集合,也是组件的集合。容器包括 listvectorsetmap 等;组件包括迭代器等。STL 的目的是标准化组件。
  4. STL C++ 的一部分,不用额外安装,被内建在支持 C++ 的编译器中。
  5. STL 的算法是标准算法,其实现了将已经定义好的算法应用在容器的对象上。

更多STL介绍请看STL是什么

二、C++ vector简介

  1. vector<T> 容器是包含 T 类型元素的序列容器,和 array<TN> 容器相似,不同的是 vector<T> 容器的大小可以自动增长,从而可以包含任意数量的元素;因此类型参数 T 不再需要模板参数 N。只要元素个数超出 vector 当前容量,就会自动分配更多的空间。只能在容器尾部高效地删除或添加元素。
  2. vector<T> 容器可以方便、灵活地代替数组。在大多数时候,都可以用 vector<T> 代替数组存放元素。只要能够意识到,vector<T> 在扩展容量,以 及在序列内部删除或添加元素时会产生一些开销;但大多数情况下,代码不会明显变慢。 为了使用 vector<T> 容器模板,需要在代码中包含头文件 \#include<vector>
  3. 时间复杂度:该容器随机存取任何元素都能在常数时间O(1)完成,在尾端增删元素具有最佳的性能(大部分时间是常数时间,即在不需要重新分配存储空间的情况下。在一些特殊的情况下需要的时间是O(n),比如当所需要的存储空间超过了之前动态分配的空间,这时候就需要重新分配存储空间,需要进行一个数组的拷贝工作)当在vector<T>中间或者头部插入或者删除元素所需要的时间复杂度为O(n)因为我们需要将后面的元素一次向后移动一个位置。

三、C++ vector的常用方法

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. //定义一个输出vector模板
  5. /*为了方便打印不同类型的vector,如果vector的类型比较少
  6. 可以使用for循环打印,例如定义一个 vector<int> num;
  7. 输出可以用:
  8. //输出num中的内容 size():返回Vector元素数量的大小
  9. for(int i=0;i<num.size();i++){
  10. cout<<num[i]<<" "; //可以使用[]访问,也可以使用at()方法访问
  11. cout<<num.at(i)<<" "; //at():返回指定位置的元素
  12. }
  13. cout<<endl;
  14. */
  15. template<class T>
  16. void printVector(T s,T e){
  17. for(;s != e;++s){
  18. cout<<*s<<" ";
  19. }
  20. cout<<endl;
  21. }
  22. int main(){
  23. vector<int> num; //生成存放 int 型元素的 vector<T> 容器
  24. cout<<"赋值之前num的容量:"<<num.capacity()<<endl;
  25. //capacity()返回vector所能容纳的元素数量(在不重新分配内存的情况下) 此时没有初始化,所以size() 和 capacity() 都是0;size() 返回容器目前存在的元素个数。
  26. //以初始化列表中的値作为元素初始值,生成有 6个浮点数的vector容器。
  27. double a[6] = {1.1,2.6,3.8,4.9,5.6,6.6};
  28. vector<double> number(a,a+6);
  29. printVector(number.begin(),number.end());
  30. //string A[4] = {"str1","str2","str3","str4"};
  31. //vector<string> str(A,A+4);
  32. //str有4个元素,全部初始化为 "abc"
  33. vector<string> str(4,"abc");
  34. printVector(str.begin(),str.end());
  35. //向容器中添加元素
  36. for(int i=0;i<10;i++){
  37. num.push_back(i); //push_back():在Vector最后添加一个元素
  38. }
  39. cout<<"赋值之后num的容量:"<<num.capacity()<<endl;
  40. //输出num中的内容 size():返回Vector元素数量的大小
  41. for(int i=0;i<num.size();i++){
  42. cout<<num[i]<<" "; //可以使用[]访问,也可以使用at()方法访问
  43. cout<<num.at(i)<<" "; //at():返回指定位置的元素
  44. }
  45. cout<<endl;
  46. //insert():插入元素到Vector中
  47. num.insert(num.begin()+3,10); //将 10 插入到下标为3的位置
  48. //begin():返回第一个元素的迭代器
  49. //end():返回最末元素的迭代器(译注:实指向最末元素的下一个位置)
  50. printVector(num.begin(),num.end());
  51. //将num的一段0,1,2,3,4从下标为 3 的位置插入
  52. num.insert(num.begin()+3,num.begin(),num.begin()+5);
  53. printVector(num.begin(),num.end());
  54. num.erase(num.begin()+3); //删除下标为 3 位置上的元素
  55. printVector(num.begin(),num.end());
  56. //删除一段元素
  57. num.erase(num.begin(),num.end()-2);
  58. printVector(num.begin(),num.end());
  59. cout<<"删除前str内容为:";
  60. printVector(str.begin(),str.end());
  61. //删除所有的元素
  62. str.clear();
  63. cout<<"删除后str内容为:";
  64. printVector(str.begin(),str.end());
  65. return 0;
  66. }

运行结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTc1NTA3_size_16_color_FFFFFF_t_70

四、C++ vector的所有方法(更加详细的内容请参考C++的API:https://en.cppreference.com/w/cpp/container/vector

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTc1NTA3_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTc1NTA3_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTc1NTA3_size_16_color_FFFFFF_t_70 3

发表评论

表情:
评论列表 (有 0 条评论,85人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ vector

    一,什么是矢量 STL容器(矢量)是一个动态数组,也可以叫它向量,是一个线性顺序结构,相当于数组,与数组不同的是可以不预先指定数组的大小,因为它可以自动扩展。 二,向

    相关 C++vector

    前言 标准库类型vector表示对象集合,并且所有的对象类型相同。由于它常常“容纳”其他对象,因此常称作容器。vector也是一个类模板。编译器根据模板创建类型或函数的过