vector以及使用举例--C++基础

简介: vector以及使用举例--C++基础

常见的STL有:vector、list、stack、queue、deque、map、set

接下来我将依此介绍这些STL以及其常见的用法。


序列式容器:

vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。

vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器start和finish分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间的尾端。一旦容量等于大小,便是满载,下次再有新增元素,vector的整个数组就得另觅他处。


动态扩容:当插入新元素发现当前容量不够时,扩容机制又是如何的?接下来我们通过代码来分析一下。

#include"Test.h"
#include<vector>
#include<list>
#include<array>
#include<algorithm>//为了使用find、sort等方法
void main()
{
  setlocale(LC_ALL, "chs");//识别中文
  //vector举例
  vector<int> v1(3, 8);
  cout << "当前数组大小:" << v1.size() << endl;
  cout << "当前数组容量:" << v1.capacity() << endl;   
  v1.push_back(1);
  cout << "当前数组大小:" << v1.size() << endl;
  cout << "当前数组容量:" << v1.capacity() << endl;
  v1.push_back(2);
  cout << "当前数组大小:" << v1.size() << endl;
  cout << "当前数组容量:" << v1.capacity() << endl;
  v1.push_back(3);
  cout << "当前数组大小:" << v1.size() << endl;
  cout << "当前数组容量:" << v1.capacity() << endl;
  v1.push_back(4);
  cout << "当前数组大小:" << v1.size() << endl;
  cout << "当前数组容量:" << v1.capacity() << endl;
  v1.push_back(5);
  cout << "当前数组大小:" << v1.size() << endl;
  cout << "当前数组容量:" << v1.capacity() << endl;
  for (vector<int>::iterator v2 = v1.begin();
    v2 != v1.end(); v2++)
  {
    cout << *v2 << endl;
  }
  v1.pop_back();
  v1.pop_back();
  v1.pop_back();
  v1.pop_back();
  v1.pop_back();
  cout << "当前数组大小:" << v1.size() << endl;
  cout << "当前数组容量:" << v1.capacity() << endl;
  v1.clear();
  cout << "当前数组大小:" << v1.size() << endl;
  cout << "当前数组容量:" << v1.capacity() << endl;
  //用list实现增改删除
}

image.png


image.png


image.png


image.png


image.png


image.png


image.png


我从书本中看来的是动态扩容机制是以原本的2倍容量扩容,并且是另外开辟一块内存空间实现内存数据的拷贝,但是我在自己手写测试代码的扩容的过程中,感觉并不是以2倍的大小扩容,更像是以1.5倍的大小进行扩容,并且感觉v1的地址也没有进行改变。。。。后三张和前面几张图片的v1地址不同是因为,我截后几张图的时候,是重新调试了。


但是经过实验可以验证,当我们的最大容量和数组大小一样的时候,再进行插入,会进行扩容,并且通过pop_back或者clear方法,只会清除里面的数据,不会改变vector的容量大小,即它会动态扩容,但不会自动缩小。


erase使用注意,避免迭代器失效:

  for (vector<int>::iterator v2 = v1.begin();
    v2 != v1.end();)
  {
    if (*v2 == 1)
    {
      v2 = v1.erase(v2, v2 + 3);
    }
    else
    {
      v2++;
    }
  }

“No amount of money ever bought a second of time.”

参考资料:

《STL源码剖析》

目录
相关文章
|
9月前
|
算法 编译器 C++
模拟实现c++中的vector模版
模拟实现c++中的vector模版
|
12月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
680 4
|
11月前
|
存储 对象存储 C++
C++ 中 std::array<int, array_size> 与 std::vector<int> 的深入对比
本文深入对比了 C++ 标准库中的 `std::array` 和 `std::vector`,从内存管理、性能、功能特性、使用场景等方面详细分析了两者的差异。`std::array` 适合固定大小的数据和高性能需求,而 `std::vector` 则提供了动态调整大小的灵活性,适用于数据量不确定或需要频繁操作的场景。选择合适的容器可以提高代码的效率和可靠性。
|
11月前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
254 0
|
存储 C++ 索引
【C++打怪之路Lv9】-- vector
【C++打怪之路Lv9】-- vector
221 1
|
编译器 C++
【C++】—— vector模拟实现
【C++】—— vector模拟实现
|
算法 C++ 容器
C++之打造my vector篇(下)
C++之打造my vector篇(下)
120 0
|
存储 编译器 C++
C++之打造my vector篇(上)
C++之打造my vector篇(上)
149 0
|
算法 C++ 容器
【C++】—— vector使用
【C++】—— vector使用
|
存储 缓存 C++
C++番外篇——list与vector的比较
C++番外篇——list与vector的比较
201 0