• C++之容器类有趣的实验(二百四十一)


    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

    优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

    人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

    更多原创,欢迎关注:Android系统攻城狮

    欢迎关注Android系统攻城狮

    1.前言

    本篇目的:理解C++之向容器中添加nullptr空指针,容器size()会增大吗?为什么?

    通过C++的20个容器类进行实验,看看有什么结果?

    2.C++ 容器类介绍

    C++提供了多种容器,以下是常用的20个容器及其举例:

    1. 数组 (array):固定大小的连续存储空间。例如:int numbers[5] = {1, 2, 3, 4, 5}。

    2. 向量 (vector):可变大小的动态数组。例如:vector numbers = {1, 2, 3, 4, 5}。

    3. 列表 (list):双向链表。例如:list numbers = {1, 2, 3, 4, 5}。

    4. 堆栈 (stack):后进先出 (LIFO) 的数据结构。例如:stack numbers; numbers.push(1); numbers.push(2);。

    5. 队列 (queue):先进先出 (FIFO) 的数据结构。例如:queue numbers; numbers.push(1); numbers.push(2);。

    6. 双端队列 (deque):两端都可以进行插入和删除操作的队列。例如:deque numbers = {1, 2, 3, 4, 5}。

    7. 集合 (set):不重复元素的无序集合。例如:set numbers = {1, 2, 3, 4, 5}。

    8. 映射 (map):键-值对的集合,根据键进行查找。例如:map studentScores = {{“Alice”, 90}, {“Bob”, 85}}。

    9. 哈希表 (unordered_map):基于哈希函数实现的映射容器。例如:unordered_map studentScores = {{“Alice”, 90}, {“Bob”, 85}}。

    10. 树 (tree):一种层次结构,如二叉搜索树 (binary search tree) 或红黑树 (red-black tree)。例如:BST树。

    11. 堆 (heap):一种优先级队列,按照特定规则进行元素的插入和删除。例如:priority_queue numbers; numbers.push(1); numbers.push(2);。

    12. 栈 (array-based stack):基于数组的栈实现。例如:stack numbers; numbers.push(1); numbers.push(2);。

    13. 单向链表 (forward_list):单向链表的容器。例如:forward_list numbers = {1, 2, 3, 4, 5}。

    14. 多重集合 (multiset):允许重复元素的集合。例如:multiset numbers = {1, 2, 2, 3, 4, 4, 4}。

    15. 多重映射 (multimap):允许重复键的映射容器。例如:multimap studentScores = {{“Alice”, 90}, {“Bob”, 85}, {“Alice”, 95}}。

    16. 哈希集合 (unordered_set):基于哈希函数实现的集合容器。例如:unordered_set numbers = {1, 2, 3, 4, 5}。

    17. 字符串 (string):字符串容器。例如:string str = “Hello, world!”。

    18. 位集合 (bitset):固定大小的位集合容器。例如:bitset<8> bits = 8;。

    19. 链式哈希集合 (unordered_multiset):基于哈希函数实现的允许重复元素的集合容器。例如:unordered_multiset numbers = {1, 2, 2, 3, 4, 4, 4}。

    20. 链式哈希映射 (unordered_multimap):基于哈希函数实现的允许重复键的映射容器。例如:unordered_multimap studentScores = {{“Alice”, 90}, {“Bob”, 85}, {“Alice”, 95}}。

    3.实例

    v1.0

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int main() {
    
      // array
      array<int*, 5> arr = {nullptr};
      cout << "Array size: " << arr.size() << endl;
    
      // vector
      vector<int*> vec;
      cout << "Vector size: " << vec.size() << endl;
      vec.push_back(nullptr);
      cout << "Vector size: " << vec.size() << endl;
    
      // list
      list<int*> lis;
      cout << "List size: " << lis.size() << endl;
      lis.push_back(nullptr);
      cout << "List size: " << lis.size() << endl;
    
      // stack
      stack<int*> sta;
      cout << "Stack size: " << sta.size() << endl;
      sta.push(nullptr);
      cout << "Stack size: " << sta.size() << endl;
    
      // queue
      queue<int*> que;
      cout << "Queue size: " << que.size() << endl;
      que.push(nullptr);
      cout << "Queue size: " << que.size() << endl;
    
      // deque
      deque<int*> deq;
      cout << "Deque size: " << deq.size() << endl;
      deq.push_back(nullptr);
      cout << "Deque size: " << deq.size() << endl;
    
      // set
      set<int*> se;
      cout << "Set size: " << se.size() << endl;
      se.insert(nullptr);
      cout << "Set size: " << se.size() << endl;
    
      // map
      map<int*, int> ma;
      cout << "Map size: " << ma.size() << endl;
      ma[nullptr] = 0;
      cout << "Map size: " << ma.size() << endl;
    
      // unordered_map
      unordered_map<int*, int> ump;
      cout << "Unordered Map size: " << ump.size() << endl;
      ump[nullptr] = 0;
      cout << "Unordered Map size: " << ump.size() << endl;
    
      // array-based stack
      stack<int*, vector<int*>> abs;
      cout << "Array-based Stack size: " << abs.size() << endl;
      abs.push(nullptr);
      cout << "Array-based Stack size: " << abs.size() << endl;
    
      // forward_list
      forward_list<int*> flis;
      cout << "Forward List size: " << distance(flis.begin(), flis.end()) << endl;
      flis.push_front(nullptr);
      cout << "Forward List size: " << distance(flis.begin(), flis.end()) << endl;
    
      // multiset  
      multiset<int*> mse;
      cout << "Multiset size: " << mse.size() << endl;
      mse.insert(nullptr);
      cout << "Multiset size: " << mse.size() << endl;
    
      // multimap
      multimap<int*, int> mmap;
      cout << "Multimap size: " << mmap.size() << endl;
      mmap.insert({nullptr, 0});
      cout << "Multimap size: " << mmap.size() << endl;
    
      // unordered_set
      unordered_set<int*> use;
      cout << "Unordered Set size: " << use.size() << endl;
      use.insert(nullptr);
      cout << "Unordered Set size: " << use.size() << endl;
    
      // string
      string str;
      cout << "String size: " << str.size() << endl;
      str.push_back('\0');
      cout << "String size: " << str.size() << endl;
    
      // bitset
      bitset<1> bits;
      cout << "Bitset size: " << bits.size() << endl;
      bits[0] = 0;
      cout << "Bitset size: " << bits.size() << endl;
    
      // unordered_multiset
      unordered_multiset<int*> umse;
      cout << "Unordered Multiset size: " << umse.size() << endl;
      umse.insert(nullptr);
      cout << "Unordered Multiset size: " << umse.size() << endl;
    
      // unordered_multimap
      unordered_multimap<int*, int> ummap;
      cout << "Unordered Multimap size: " << ummap.size() << endl;
      ummap.insert({nullptr, 0});
      cout << "Unordered Multimap size: " << ummap.size() << endl;
    
      return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128

    打印结果:
    Array size: 5
    Vector size: 0
    Vector size: 1
    List size: 0
    List size: 1
    Stack size: 0
    Stack size: 1
    Queue size: 0
    Queue size: 1
    Deque size: 0
    Deque size: 1
    Set size: 0
    Set size: 1
    Map size: 0
    Map size: 1
    Unordered Map size: 0
    Unordered Map size: 1
    Array-based Stack size: 0
    Array-based Stack size: 1
    Forward List size: 0
    Forward List size: 1
    Multiset size: 0
    Multiset size: 1
    Multimap size: 0
    Multimap size: 1
    Unordered Set size: 0
    Unordered Set size: 1
    String size: 0
    String size: 1
    Bitset size: 1
    Bitset size: 1
    Unordered Multiset size: 0
    Unordered Multiset size: 1
    Unordered Multimap size: 0
    Unordered Multimap size: 1

    v2.0

    #include 
    #include 
    #include 
    
    int main() {
      std::vector<std::string*> buf;
      printf("size = %ld\n",buf.size());
      buf.push_back(nullptr);
      printf("size = %ld\n",buf.size());
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    打印结果:
    size = 0
    size = 1

    4.实验结果

    <1>.当将 nullptr 添加到 std::vectorstd::string* 中时,实际上是将一个空指针的地址添加到了容器中,并不是将空指针本身存储到容器中。

    <2>.在这种情况下,使用 buf.push_back(nullptr) 是合法的,因为 std::vectorstd::string* 可以存储指针类型的元素。所以在执行完 buf.push_back(nullptr) 后,容器中会存储一个空指针的地址。

    <3>.因此,当你打印 buf.size() 时,结果为 1,表示容器中有一个元素,即空指针。

    <4>.注意,虽然空指针本身不占用任何内存空间,但是指针的地址存储在容器中占用了一个元素的位置

  • 相关阅读:
    C#语言async, await 简单介绍与实例(入门级)
    【组件封装】显示实时时间和星期几·附文字特效
    测试人即用宝典,全网最全的功能测试点,有这一篇完全足够......
    地图导航测试用例,你get了吗?
    基于Hadoop搭建HA集群网盘系统
    aio-3588SJD4 qt环境配置记录
    代码随想录一一一双指针法一一一移除元素
    企业商标信息查询API的优势和应用实例分析
    产品经理与项目经理的区别?
    docker容器管理-实操命令
  • 原文地址:https://blog.csdn.net/u010164190/article/details/133396645